Tomer Ben David (8) [Avatar] Offline
#1
I was sure the below underscores are for return type of type unit meaning function return value is ignored. If that's correct then I have a question about the below code:

case class AccountRepository(no: String)


trait AccountService[Account, Amount, Balance] {
  def open(no: String, name: String, openingDate: Option[Date]): AccountRepository => Try[Account]
  def close(no: String, closeDate: Option[Date])AccountRepository => Try[Account]
  def debit(no: String, amount: Amount): AccountRepository => Try[Account]
  def credit(no: String, amount: Amount): AccountRepository => Try[Account]
  def balance(no: String): AccountRepository => Try[Balance]
}


object App extends AccountService {
  def op(no: String) = for {
    _ <- credit(no, BigDecimal(100)) // isn't underscore here mean we neglect the return value as its in most cases unit? this mixes me up.  How do we refer again to the return value if it goes into the underscore which is normally used for unit response.
    _ <- credit(no, BigDecimal(300))
    _ <- debit(no, BigDecimal(160))
    b <- balance(no)
  } yield b
}

scala> op("a-123")
res0: AccountRepository => scala.util.Try[Balance] = <function1>


Will this code work correctly? It will, provided we give some additional power to Function1, which is the type that gets threaded through the comprehension.


So I should be passing to res0 the repository - I don't get how is the repository being throttled to each credit/debit method above? I understand the op returns a function from repository to account however what mixes me up are all these underscores - doesn't underscore means in for comprehension we get rid of the function return value? and if we ignore the returned value then how can we pass those functions the repository? credit debit functions are returning a function AccountRepository => Try[Account] so it looks to me like i somehow need the return value from a sequence step and not to assign it to _ which as far as i know ignores it so that I can further on apply it with the correct accountRepository so that the computation can take place, so i don't understand why its said not to be needed it looks to me like the return value is needed but the example does not populate it.
Debasish Ghosh (111) [Avatar] Offline
#2
When we specify an _ in a for comprehension it doesn't mean that the return type is changed to Unit. It means that I don't need the name explicitly in my code. The threading is done as usual through the Try monad. As an exercise write a for-comprehension using _ and see the de-sugared version that the compiler generates.

Let me know if you need more details.

Thanks.