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

Kar*_*arl 11 haskell idris

我最近有幸学习了一些Idris,我发现非常方便的一件事是!-notation,它让我缩短了do块中的monadic代码,比如

a' <- a
b' <- b
c' <- c
someFunction a' b' c'
Run Code Online (Sandbox Code Playgroud)

更好的

someFunction !a !b !c
Run Code Online (Sandbox Code Playgroud)

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

chi*_*chi 20

因为每个monad都是 Applicative(GHC> = 7.10)我们可以写

someFunction <$> a <*> b <*> c
Run Code Online (Sandbox Code Playgroud)

请注意,如果someFunction返回类型的monadic值,则返回m T上面的内容m (m T),这可能不是我们想要的(正如@pigworker在下面指出的那样).然而join,我们可以将两层结合在一起:

join $ someFunction <$> a <*> b <*> c
Run Code Online (Sandbox Code Playgroud)

  • 完美的答案,正是我所需要的。我想我需要花更多的时间在 Applicative 上。谢谢。 (2认同)
  • `someFunction`的类型是什么?它的返回类型是monadic吗? (2认同)

Ale*_*nov 6

@ chi答案的另一种选择是liftA3 someFunction a b c(join如果需要的话).