Haskell版的Idris! - 注释(轰号)

时间:2015-10-19 16:54:41

标签: haskell idris

我最近有幸学习了一些伊德里斯,我发现一件非常方便的事情是! - 注释,这让我在一个阻止这样做的块中缩短了monadic代码如

a' <- a
b' <- b
c' <- c
someFunction a' b' c'

更好的

someFunction !a !b !c

现在当我在Haskell中编写代码时,我正在寻找类似的东西,但据我所知它并不存在(并且爆炸字符显然已经用于严格的模式匹配)。有没有办法避免在do块中有一堆琐碎的左箭头?也许是一个添加重写规则的扩展,或者那种效果?

3 个答案:

答案 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)

不是我推荐这个。