Ric*_*ban 15 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
Run Code Online (Sandbox Code Playgroud)
对于我的生活,我无法理解任何有用的情况.起初我认为它可能被用作链式运算符,因此您可以将值传递给函数,然后返回原始值.我以前自己写过这样一个算子,但你可以看到它不一样:
let (>|) x f = f x; x
Run Code Online (Sandbox Code Playgroud)
如果我们部分应用K组合子(值为5),那么我们返回一个忽略其参数的函数,而是返回5.再次,没有用.
(K 5) = fun y -> 5
Run Code Online (Sandbox Code Playgroud)
任何人都可以给我一个简单的例子,说明这可能会被使用吗?
Gus*_*Gus 15
这是一个非常简单的例子:
让我们假设我有一个结构,就像我可以映射函数的列表.
let K x y = x
let lst = [3;5;13;2]
Run Code Online (Sandbox Code Playgroud)
我可以像这样映射数学函数:
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]
Run Code Online (Sandbox Code Playgroud)
如果我想映射常量函数怎么办?
let tens = lst |> List.map (K 10) // instead of writing List.map (fun x -> 10)
// val tens : int list = [10; 10; 10; 10]
Run Code Online (Sandbox Code Playgroud)
鉴于在FP中您通常将函数作为参数传递,K组合器允许您通过几次击键来指定常量函数.