隐性或无点式编程允许人们创建函数而不考虑它们的参数。这可以在 F# 中完成吗?
问问题
283 次
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 回答