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)
假设我们有两个函数:
只有一个参数,例如部分应用的加法:
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)