使用Scalaz>>和>> =在同一个表达式中

时间:2014-04-01 14:55:28

标签: scala monads scalaz

在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

0 个答案:

没有答案