(红隼)K-combinator:为什么它有用?

时间:2014-10-01 10:59:55

标签: f# functional-programming sample combinators k-combinator

我最近一直在接受F#(我的背景是C#)并正在阅读网站http://fsharpforfunandprofit.com,我觉得这很有帮助。

我已经到了http://fsharpforfunandprofit.com/posts/defining-functions/,这是关于组合器的部分。除了红隼之外,我全都了解它们(虽然Y组合器或Sage鸟用我的脑子拧!)。 Scott Wlaschin给出了定义(在F#中):

let K x y = x

对于我的生活,我无法理解任何有用的情况。起初我认为它可能被用作链式运算符,因此您可以将值传递给函数,然后返回原始值。我以前自己写过这样一个操作符,但你可以看到它不一样:

let (>|) x f = f x; x

如果我们部分应用K组合子(值为5),那么我们返回一个忽略其参数的函数,而是返回5.再次,没用。

(K 5) = fun y -> 5

有人能给我一个简单的例子,说明可以使用它吗?

1 个答案:

答案 0 :(得分:15)

这是一个非常简单的例子:

假设我有一个结构,就像我可以映射函数的列表一样。

let K x y = x

let lst = [3;5;13;2]

我可以像这样映射数学函数:

let plus5  = lst |> List.map ((+)5) // instead of writing List.map (fun x -> 5 + x)
// val plus5 : int list = [8; 10; 18; 7]

let times3 = lst |> List.map ((*)3) // instead of writing List.map (fun x -> 3 * x)
// val times3 : int list = [9; 15; 39; 6]

如果我想映射常量函数怎么办?

let tens = lst |> List.map (K 10) // instead of writing List.map (fun x -> 10)
// val tens : int list = [10; 10; 10; 10]

鉴于在FP中您通常将函数作为参数传递,K组合器允许您通过几次击键来指定常量函数。