我最近有幸学习了一些伊德里斯,我发现一件非常方便的事情是! - 注释,这让我在一个阻止这样做的块中缩短了monadic代码如
a' <- a
b' <- b
c' <- c
someFunction a' b' c'
更好的
someFunction !a !b !c
现在当我在Haskell中编写代码时,我正在寻找类似的东西,但据我所知它并不存在(并且爆炸字符显然已经用于严格的模式匹配)。有没有办法避免在do块中有一堆琐碎的左箭头?也许是一个添加重写规则的扩展,或者那种效果?
答案 0 :(得分:20)
由于每个monad都是Applicative
(GHC&gt; = 7.10),我们可以写
someFunction <$> a <*> b <*> c
请注意,如果someFunction
返回类型为m T
的monadic值,则上述内容将返回m (m T)
,这可能不是我们想要的(正如@pigworker在下面指出的那样)。然而,我们可以join
将这两个层组合在一起:
join $ someFunction <$> a <*> b <*> c
答案 1 :(得分:6)
@ chi的答案替代liftA3 someFunction a b c
(如果需要,可以join
)。
答案 2 :(得分:2)
说到箭头......
import Control.Arrow
a' = Kleisli $ const a
b' = Kleisli $ const b
c' = Kleisli $ const c
foo = (`runKleisli`()) $
(a' &&& b') &&& c' >>> uncurry (uncurry someFunction)
不是我推荐这个。