F#

时间:2018-08-17 11:25:16

标签: f# functional-programming ml calculus

假设我们有两个功能:

一个具有单个参数的参数,例如部分应用的加法:

let plus1 = (+) 1 
// the same as let plus1 x = 1 + x

另一个需要两个参数的参数,例如乘法:

let mult = (*) 

我们现在可以创建

let addOneAndMultiply x = mult x (plus1 x)

f x(g x)通常称为SKI组合器演算

在haskell中,可以使用星舰<*>运算符来缩短类似的功能:

//haskell
mult <*> plus1

有什么方法可以在F#中执行相同的SKI技巧?

1 个答案:

答案 0 :(得分:3)

在F#中执行此操作非常简单:

let (<*>) f g x = f x (g x)

为了证明这可行:

let plus1 = (+) 1
let mult = (*)
let addOneAndMultiply = mult <*> plus1

addOneAndMultiply 2 // Result: 6
addOneAndMultiply 3 // Result: 12
addOneAndMultiply 4 // Result: 20

P.S。如果要使其成为函数而不是运算符,只需将(<*>)替换为要定义的函数的名称:

let starling f g x = f x (g x)