Functional programming SKI演算与BCKW的实际应用

Functional programming SKI演算与BCKW的实际应用,functional-programming,lambda-calculus,Functional Programming,Lambda Calculus,我能理解如何创建和思考滑雪和BCKW演算,但我永远无法找到实际用途。也许我看得不够深?也就是说,我想知道(请举一个例子,我并不是说这是真的)Java servlet是否广泛使用S,Python生成器是BCW的一个例子,我只是看不透树丛?尽管lambda和SKI演算没有反映大多数编程语言的输入和输出系统(例如图形、网络连接,甚至可以说是标准输入和输出),实际计算机编程的结构方式与Lambda(以及SKI和BCKW)相对应,例如递归的思想和函数的调用方式。许多编程语言都有lambda抽象作为函数使用

我能理解如何创建和思考滑雪和BCKW演算,但我永远无法找到实际用途。也许我看得不够深?也就是说,我想知道(请举一个例子,我并不是说这是真的)Java servlet是否广泛使用S,Python生成器是BCW的一个例子,我只是看不透树丛?

尽管lambda和SKI演算没有反映大多数编程语言的输入和输出系统(例如图形、网络连接,甚至可以说是标准输入和输出),实际计算机编程的结构方式与Lambda(以及SKI和BCKW)相对应,例如递归的思想和函数的调用方式。许多编程语言都有lambda抽象作为函数使用。

都是关于控制的

可能从较低的级别开始。应用程序系统只是一个可以将对象应用于其他对象的系统。应用程序系统的一个简单示例是bash。 还有吗 有人可能会假设他们在某个环境中,上面的意思是在该环境中执行ls,然后执行更多操作 更多@(ls@环境) 然而,我们可以做更复杂的事情,比如 ls | grep模式|更多 现在在应用符号中,这是 更多((grep@pattern)@(ls@environment))。 请注意grep@pattern。grep应用于一个模式,该模式返回程序以在ls的结果中匹配该模式。这是应用点,将程序应用于参数,从“原子”(又名builtin)构建新程序程序。但是,我们不能只使用原语应用程序或内置程序进行太多编程。我们需要一种方法来构造输入,并将原语应用到输入中

这就是lambda的作用。使用lambda可以推广 (grep@pattern) 将grep应用于任何输入, (grep@X) 然而,我们必须有一种方法来获得grep的输入,因此我们通常使用函数。 f(X)=grep@X 上面的过程称为提取参数。但是没有理由认为名称f是特殊的,所以我们有一个语法: lambda X.grep@X 然后lambda X.grep@X可以应用于输入,输入将被替换到主体中并进行计算。然而,替换可能会变得混乱,绑定变量可能会很难在机器上实现。S-K-I(或B,C,K,W)提供了一种不替换lambda内容的方法,而只是在应用程序之间交换

概括地说,应用程序就是它的全部。在将程序应用到某个东西(可能是另一个程序)的层次上进行推理非常方便。Lambda演算提供了一种方法来构造输入,并将程序应用到参数。SKI提供了一种方法来执行Lambda,而无需显式替换

需要注意的是,SKI Reduce本质上是惰性的,因此在实际使用SKI构建应用程序时可能需要考虑一些因素。事实上,这些参数现在可能已经被完全评估过,也可能是部分应用程序。可以使用类型理论来解决这一问题,并且只有在程序位于应用程序的头部位置。即,如果使用闭合lambda术语编写,则转换为SKI, 那么如果 p@arg1@。。。。
如果p是一个原语程序,那么重写就完成了,所以它的所有参数都是1)可用的,2)完全求值的。然而,我还没有证明这一点,用一个足够强大的类型理论也可能不成立……

SKI和BCKW演算与Lambda演算(在函数式编程概念中有着著名的应用)不同,因为它们是独立的。另见。它们构成了理解如何构造没有命名参数的函数程序的基础

我们看到it在某些语言中的应用(例如和)。我曾经谈论过SK演算与Cat和Joy的关系

值得一提的是:BCKW和滑雪(或SK)结石实际上是一样的,但BCKW基础已经不流行了。

在哈斯克尔,它们是一样的

  • B
  • C
    flip
  • K
    pure
  • I
    id
  • S
  • W
    join
从哈斯克尔的观点来看,
的意思是“在上下文中执行”

  • (+2)(*3)
    表示乘以三后再加二
  • (+2)[1,2,3]
    表示在列表中的每个元素中添加两个
  • (+2)(read.getLine)
    意味着在我刚读到的数字上加上两个
  • (+2)someParser
    意味着在我刚刚解析的数字上加上两个
有上下文的东西称为函子。所有Java/Python/C++迭代器都是奇怪的由内而外版本的functor

另一个连接:S和K组合子一起是图灵完备的。在Haskell中,
pure
一起构成了一个应用函子


当然,了解其他组合器如何适应需要学习Haskell。但是这个例子展示了组合词是如何在语言中根深蒂固的。

这些只是用于函数实例,这很酷,但我不会说B字面上是等。B组合词一般是
()
(compose),而不是
(fmap)–除非在funcs的特定情况下,如您所示。K组合符通常是
常量
,而不是
(同样,fns的特殊情况除外)。对于fns,W只是
join
,而不是任意的monad。(C=翻转,I=在所有一般情况下保持不变。)也许这是迂腐。你的回答很好,但绝对是真的