首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Haskell组合(.)vs F#的管道转发运算符(|>)

Haskell组合(.)vs F#的管道转发运算符(|>)
EN

Stack Overflow用户
提问于 2009-09-21 22:04:33
回答 7查看 26.1K关注 0票数 105

在F#中,管道转发操作符|>的使用非常普遍。然而,在Haskell中,我只看到函数组合(.)被使用。我知道它们是related,但是有没有语言原因导致Haskell不使用管道转发,或者是其他原因?

EN

回答 7

Stack Overflow用户

发布于 2009-09-22 10:12:12

在F#中,(|>)很重要,因为它是从左到右的类型检查。例如:

代码语言:javascript
复制
List.map (fun x -> x.Value) xs

通常不会进行类型检查,因为即使知道xs的类型,当类型检查器看到lambda的参数x的类型时,它也不知道它的类型,所以它不知道如何解析x.Value

相比之下,

代码语言:javascript
复制
xs |> List.map (fun x -> x.Value)

将工作得很好,因为xs的类型将导致x的类型是已知的。

从左到右的类型检查是必需的,因为像x.Value这样的构造涉及到名称解析。Simon Peyton Jones编写了一个proposal,用于向Haskell添加类似的名称解析,但他建议使用本地约束来跟踪类型是否支持特定的操作。因此,在第一个示例中,x需要Value属性的要求将继续下去,直到看到xs,并且这个要求可以得到解决。不过,这确实会使类型系统变得复杂。

票数 88
EN

Stack Overflow用户

发布于 2009-09-22 06:57:26

更多的猜测,这一次来自Haskell一方。

($)(|>)的翻转,当您不能编写无指针代码时,它的使用非常普遍。所以在Haskell中不使用(|>)的主要原因是它已经被($)取代了。

此外,从一些F#经验来看,我认为(|>)在F#代码中非常流行,因为它类似于面向对象的Subject.Verb(Object)结构。由于F#的目标是实现一个平滑的函数式/面向对象的集成,因此对于新的函数式程序员来说,Subject |> Verb Object是一个非常平滑的过渡。

就我个人而言,我也喜欢从左到右思考,所以我在Haskell中使用(|>),但我认为其他人不会这样做。

票数 46
EN

Stack Overflow用户

发布于 2011-04-23 01:48:45

我想我们把事情搞混了。哈斯克尔的(.)等同于F#的(>>)。不要与F#的(|>)混淆,后者只是一个倒置函数应用程序,就像哈斯克尔的($) -倒置的:

代码语言:javascript
复制
let (>>) f g x = g (f x)
let (|>) x f = f x

我相信Haskell程序员确实经常使用$。也许没有F#程序员倾向于使用|>那么频繁。另一方面,一些F#用户对>>的使用达到了荒唐的程度:http://blogs.msdn.com/b/ashleyf/archive/2011/04/21/programming-is-pointless.aspx

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

https://stackoverflow.com/questions/1457140

复制
相关文章

相似问题

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