在 F# 中,使用管道转发运算符 |>
非常常见。然而,在 Haskell 中,我只见过使用函数组合 (.)
。我明白他们是related ,但是是否有语言原因导致 Haskell 中不使用管道转发,或者是其他什么原因?
最佳答案
在 F# 中 (|>)
很重要,因为从左到右的类型检查。例如:
List.map (fun x -> x.Value) xs
通常不会进行类型检查,因为即使 xs
的类型已知,lambda 的参数 x
的类型在执行时也是未知的。 typechecker 看到了它,所以它不知道如何解析 x.Value
。
相反
xs |> List.map (fun x -> x.Value)
可以正常工作,因为 xs
的类型将导致 x
的类型已知。
由于 x.Value
等构造中涉及名称解析,因此需要从左到右进行类型检查。西蒙·佩顿·琼斯 (Simon Peyton Jones) 撰写了 proposal为 Haskell 添加类似的名称解析,但他建议使用局部约束来跟踪类型是否支持特定操作。因此,在第一个示例中,x
需要 Value
属性的要求将继续下去,直到看到 xs
并且可以解决此要求。不过,这确实使类型系统变得复杂。
关于Haskell 组合 (.) 与 F# 的管道前向运算符 (|>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1457140/