Haskell 哈斯克尔版本的伊德里斯-符号(bang符号)
最近我有幸学习了一些Idris,我发现其中一件事非常方便,那就是-表示法,让我们缩短do块中的一元代码,例如Haskell 哈斯克尔版本的伊德里斯-符号(bang符号),haskell,idris,Haskell,Idris,最近我有幸学习了一些Idris,我发现其中一件事非常方便,那就是-表示法,让我们缩短do块中的一元代码,例如 a' <- a b' <- b c' <- c someFunction a' b' c' 现在,当我用Haskell编写代码时,我正在寻找类似的东西,但据我所知,它并不存在(而且bang字符显然已经用于严格的模式匹配)。有没有办法避免do块中有一堆无关紧要的左箭头?也许是一个添加重写规则的扩展,或者类似的东西?因为每个monad都是一个应用程序(GHC>=7.10)
a' <- a
b' <- b
c' <- c
someFunction a' b' c'
现在,当我用Haskell编写代码时,我正在寻找类似的东西,但据我所知,它并不存在(而且bang字符显然已经用于严格的模式匹配)。有没有办法避免do块中有一堆无关紧要的左箭头?也许是一个添加重写规则的扩展,或者类似的东西?因为每个monad都是一个应用程序(GHC>=7.10),我们可以编写
someFunction <$> a <*> b <*> c
@chi回答的另一个选择是(如果需要,使用
join
。说到箭头
import Control.Arrow
a' = Kleisli $ const a
b' = Kleisli $ const b
c' = Kleisli $ const c
foo = (`runKleisli`()) $
(a' &&& b') &&& c' >>> uncurry (uncurry someFunction)
我并不推荐这个。完美的答案,正是我所需要的。我想我需要多花一点时间和Applicative在一起。谢谢。
someFunction
的类型是什么?它的返回类型是一元的吗?
join $ someFunction <$> a <*> b <*> c
import Control.Arrow
a' = Kleisli $ const a
b' = Kleisli $ const b
c' = Kleisli $ const c
foo = (`runKleisli`()) $
(a' &&& b') &&& c' >>> uncurry (uncurry someFunction)