4

隐性或无点式编程允许人们创建函数而不考虑它们的参数。这可以在 F# 中完成吗?

4

2 回答 2

6

只是为了配合查克的回答和克里斯史密斯的评论,你可以写

let digits = string_of_int >> String.length
digits 9000;; // 4
[1; 10; 100] |> List.map digits;; // [1;2;3]

当您将这些组合和管道运算符与高阶函数结合起来时,您可以非常简洁地完成复杂的操作:

let prodSqrtAbs = Seq.map (abs>>sqrt) >> Seq.reduce (*)
prodSqrtAbs [| -9.0; 4.0 |];;  // 6.0

编辑:我刚刚阅读了 J 及其隐式 fork 运算符。这是非常强大的。您可以在 F# 中构建等效的高阶运算符,但不会隐式应用它们。因此,例如,首先定义lift(使用显式参数)

let lift op a b x = op (a x) (b x)

然后明确地应用它

let avg = lift (/) List.sum List.length

在您链接到的维基百科页面上获得类似于J 示例的内容。但它并不完全“默契”。

于 2009-11-27T07:44:33.350 回答
3

当然。您所需要的只是函数组合和柯里化,而这两者在 F# 中都是可能的。

let compose f1 f2 = fun x -> f1 (f2 x);;
let digits = compose String.length string_of_int;;
digits 9000;; // 4
于 2009-11-27T06:30:55.993 回答