【问题标题】:(Kestrel) K-combinator: why is it useful?(Kestrel) K-combinator:为什么有用?
【发布时间】:2014-10-01 10:59:54
【问题描述】:

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

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

【问题讨论】:

  • :D 看看这个:en.wikipedia.org/wiki/SKI_combinator_calculus - 这真的只是学术上的乐趣 - 即使你在 F# 中找到了一些用途,你也不应该只称它为 K ^^
  • 顺便说一句,如果您没有立即找到它 - K 例如用于在 SKI 演算中实现布尔值、元组、数字等内容(嗯,它是一个基本的构建块;) ) - 只需将其视为对第一个组件的一种投影
  • 谢谢,我已经阅读了维基百科页面,但它没有提供比我已经拥有的更多信息。
  • 你到底想知道什么(这是一个很大的话题)
  • K-Combinator 在与部分应用程序一起使用时变得有用。它设置了“重新开始”功能。

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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢 Gustavo,我也遇到过这种情况,有时我也会使用 id(例如 lst |> sortBy id)但仍然没有得到常量函数的意义在地图中。等效的 SQL 将是 select 5 from dbo.Customers。也许我会继续思考。
  • 是的,这在 SQL 中是等价的,但在 FP 中,您可以通过将规则评估器和规则的逻辑分开的方式组合函数。将规则视为函数,您可能有一个不需要附加参数的简单规则。在这种情况下,我不时使用 K 组合器,以避免重复我自己的写作fun x -> something
  • 虽然是真实情况下的一个很好的例子,但您当然会使用更具可读性的List.replicate 4 10(或10 |> List.replicate 4
  • 是的,或者只是写 [10;10;10;10] 但我不再映射函数。
  • 感谢您的意见。我想我真正苦苦挣扎的原因是,虽然我觉得我对 F# 语言理解得很好,但我仍然没有做过太多的函数式编程,而且我从来没有写过像fun x -> something 这样的函数。总有一天我会得到它:)
猜你喜欢
  • 1970-01-01
  • 2016-12-02
  • 2021-04-06
  • 2018-05-29
  • 2016-12-18
  • 2018-09-28
  • 2020-11-13
  • 2018-01-14
  • 1970-01-01
相关资源
最近更新 更多