18

我最近一直在学习 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

谁能给我一个简单的例子来说明这可能在哪里使用?

4

1 回答 1

19

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

假设我有一个结构,比如可以映射函数的列表。

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 组合器允许您通过几次击键来指定一个常量函数。

于 2014-10-01T12:26:38.070 回答