首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell版的Idris !-notation (邦符号)

Haskell版的Idris !-notation (邦符号)
EN

Stack Overflow用户
提问于 2015-10-19 16:54:40
回答 3查看 680关注 0票数 13

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

代码语言:javascript
复制
a' <- a
b' <- b
c' <- c
someFunction a' b' c'

给更好的人

代码语言:javascript
复制
someFunction !a !b !c

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-19 17:05:59

因为每个monad都是Applicative (使用GHC >= 7.10),所以我们可以编写

代码语言:javascript
复制
someFunction <$> a <*> b <*> c

请注意,如果someFunction返回一个类型为m T的一元值,上面的值将返回m (m T),这很可能不是我们想要的(如下所示)。不过,我们可以将这两个层组合在一起:

代码语言:javascript
复制
join $ someFunction <$> a <*> b <*> c
票数 21
EN

Stack Overflow用户

发布于 2015-10-20 06:59:08

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

票数 6
EN

Stack Overflow用户

发布于 2015-10-20 11:29:11

说到箭..。

代码语言:javascript
复制
import Control.Arrow

a' = Kleisli $ const a
b' = Kleisli $ const b
c' = Kleisli $ const c

foo = (`runKleisli`()) $
  (a' &&& b') &&& c' >>> uncurry (uncurry someFunction)

这不是我推荐的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33219871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档