Следующий код bind(>>=)
в Haskell не компилируется:
ghci> [[1]] >>= Just
<interactive>:38:11:
Couldn't match type ‘Maybe’ with ‘[]’
Expected type: [t] -> [[t]]
Actual type: [t] -> Maybe [t]
In the second argument of ‘(>>=)’, namely ‘Just’
In the expression: [[1]] >>= Just
Но в Scala он действительно компилируется и запускается:
scala> List( List(1) ).flatMap(x => Some(x) )
res1: List[List[Int]] = List(List(1))
Подпись Haskell >>=
:
>>= :: Monad m => m a -> (a -> m b) -> m b
Итак, в [[1]] >>= f
, f
тип должен быть: a -> [b]
.
Почему код Scala компилируется?