假设我们有两个功能:
一个具有单个参数的参数,例如部分应用的加法:
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技巧?
答案 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)