F# 中的 SKI 组合子演算或星舰运算符

SKI combinator calculus or starship operator in F#

假设我们有两个函数:

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

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 中,这样的函数可以用 starship <*> 运算符来缩短:

//haskell
mult <*> plus1

有没有什么方法可以在 F# 中完成相同的 SKI 技巧?

在 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)