在F#中,管道转发操作符|>的使用非常普遍。然而,在Haskell中,我只看到函数组合(.)被使用。我知道它们是related,但是有没有语言原因导致Haskell不使用管道转发,或者是其他原因?
发布于 2009-09-22 10:12:12
在F#中,(|>)很重要,因为它是从左到右的类型检查。例如:
List.map (fun x -> x.Value) xs通常不会进行类型检查,因为即使知道xs的类型,当类型检查器看到lambda的参数x的类型时,它也不知道它的类型,所以它不知道如何解析x.Value。
相比之下,
xs |> List.map (fun x -> x.Value)将工作得很好,因为xs的类型将导致x的类型是已知的。
从左到右的类型检查是必需的,因为像x.Value这样的构造涉及到名称解析。Simon Peyton Jones编写了一个proposal,用于向Haskell添加类似的名称解析,但他建议使用本地约束来跟踪类型是否支持特定的操作。因此,在第一个示例中,x需要Value属性的要求将继续下去,直到看到xs,并且这个要求可以得到解决。不过,这确实会使类型系统变得复杂。
发布于 2009-09-22 06:57:26
更多的猜测,这一次来自Haskell一方。
($)是(|>)的翻转,当您不能编写无指针代码时,它的使用非常普遍。所以在Haskell中不使用(|>)的主要原因是它已经被($)取代了。
此外,从一些F#经验来看,我认为(|>)在F#代码中非常流行,因为它类似于面向对象的Subject.Verb(Object)结构。由于F#的目标是实现一个平滑的函数式/面向对象的集成,因此对于新的函数式程序员来说,Subject |> Verb Object是一个非常平滑的过渡。
就我个人而言,我也喜欢从左到右思考,所以我在Haskell中使用(|>),但我认为其他人不会这样做。
发布于 2011-04-23 01:48:45
我想我们把事情搞混了。哈斯克尔的(.)等同于F#的(>>)。不要与F#的(|>)混淆,后者只是一个倒置函数应用程序,就像哈斯克尔的($) -倒置的:
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
https://stackoverflow.com/questions/1457140
复制相似问题