最近我有幸学习了一些Idris,我发现一个非常方便的东西是-notation,它让我缩短do块中的一元代码,比如
a' <- a
b' <- b
c' <- c
someFunction a' b' c'给更好的人
someFunction !a !b !c现在,当我用Haskell编写代码时,我正在寻找类似的东西,但据我所知,它并不存在(而且邦字符显然已经用于严格的模式匹配)。有没有办法避免在do块中有一串琐碎的左箭头?也许是添加了重写规则的扩展,还是某种意义上的东西?
发布于 2015-10-19 17:05:59
因为每个monad都是Applicative (使用GHC >= 7.10),所以我们可以编写
someFunction <$> a <*> b <*> c请注意,如果someFunction返回一个类型为m T的一元值,上面的值将返回m (m T),这很可能不是我们想要的(如下所示)。不过,我们可以将这两个层组合在一起:
join $ someFunction <$> a <*> b <*> c发布于 2015-10-20 06:59:08
@chi的答案的另一种选择是liftA3 someFunction a b c (如果需要的话使用join )。
发布于 2015-10-20 11:29:11
说到箭..。
import Control.Arrow
a' = Kleisli $ const a
b' = Kleisli $ const b
c' = Kleisli $ const c
foo = (`runKleisli`()) $
(a' &&& b') &&& c' >>> uncurry (uncurry someFunction)这不是我推荐的。
https://stackoverflow.com/questions/33219871
复制相似问题