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

bri*_*gge 4 f# functional-programming tacit-programming

默认或无点样式编程允许人们创建函数而不考虑其参数.这可以在F#中完成吗?

Gab*_*iel 6

只要按照Chuck的回答和Chris Smiths的评论,你就可以写

let digits = string_of_int >> String.length
digits 9000;; // 4
[1; 10; 100] |> List.map digits;; // [1;2;3]
Run Code Online (Sandbox Code Playgroud)

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

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

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

let lift op a b x = op (a x) (b x)
Run Code Online (Sandbox Code Playgroud)

然后明确地应用它

let avg = lift (/) List.sum List.length
Run Code Online (Sandbox Code Playgroud)

在您链接到的Wikipedia页面上获得类似于J示例的内容.但它不是"默契".