Haskell 组合 (.) 与 F# 的管道前向运算符 (|>)

标签 haskell f# functional-programming composition

在 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/

相关文章:

haskell - 水平、垂直和对角线上的数字相乘

mongodb - 如何从处理程序访问全局 MongoDB 连接?

haskell - Haskell 子模块中的条件编译

haskell - runhaskell - 如何使脚本与 ghc 7.4 和 6 兼容?

list - 元组F#的排序列表

functional-programming - Common Lisp 中的 (compose)

haskell - 无法匹配预期的 Haskell 函数类型

haskell - ^ 实现中的两个函数

generics - F# 泛型约束联合类型

generics - 如何让 F# 编译器将我的参数推断为泛型函数?