Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 哈斯克尔版本的伊德里斯-符号(bang符号)_Haskell_Idris - Fatal编程技术网

Haskell 哈斯克尔版本的伊德里斯-符号(bang符号)

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)

最近我有幸学习了一些Idris,我发现其中一件事非常方便,那就是-表示法,让我们缩短do块中的一元代码,例如

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)