在Haskell中,我经常使用>>=
和>>
来构建monadic动作。例如:
> Just 1 >>= Just . (+1) >> Just ()
Just ()
在Scala中只有flatMap,所以我决定使用Scalaz >>=
和>>
。问题是我的代码有错误:
> 1.some >>= { i:Int => (i+1).some } >> ().some
<console>:14: error: type mismatch;
found : Option[Unit]
required: Int => ?
1.some >>= { i:Int => (i+1).some } >> ().some
^
我确信上面的表达式等于
1.some.>>=({ i:Int => (i+1).some }).>>(().some)
但这可以按预期工作。我认为scalac将代码解释为
1.some >>= ({ i:Int => (i+1).some } >> ().some)
由于>>
的类型,这显然是错误的。我的解释是对的吗?如果是,涉及的语法规则是什么?如果我仍想在同一个表达式中使用>>=
和>>
,那么最好的解决方案是将arg1 >>= arg2
包含在parenthesys中?像:
(1.some >>= { i:Int => (i+1).some }) >> ().some