是否有可能在F#中编写默认函数

时间:2009-11-27 05:26:12

标签: f# functional-programming tacit-programming

Tacit or point-free style programming允许创建函数而不考虑它们的参数。这可以在F#中完成吗?

2 个答案:

答案 0 :(得分:6)

与Chuck的答案一起去&克里斯史密斯的评论,你可以写

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

在您链接到的Wikipedia页面上获得类似the J example的内容。但它并非“默契”。

答案 1 :(得分:3)

不确定。你需要的只是功能组合和currying,这两种都可以在F#中使用。

let compose f1 f2 = fun x -> f1 (f2 x);;
let digits = compose String.length string_of_int;;
digits 9000;; // 4