【问题标题】:Practical application of SKI calculus and BCKWSKI微积分和BCKW的实际应用
【发布时间】:2011-04-11 00:01:18
【问题描述】:

我可以理解如何创建和思考 SKI 和 BCKW 微积分,但我永远无法找到实际用途。也许我看的不够深入?也就是说,我想知道(仅举个例子,我并不是暗示这是真的)Java Servlet 广泛使用 S,而 Python 生成器是 BCW 的一个例子,而我只是无法看穿森林?

【问题讨论】:

    标签: functional-programming lambda-calculus


    【解决方案1】:

    虽然 lambda 和 SKI 演算不反映大多数编程语言的输入和输出系统(例如图形、网络连接,甚至可以说是标准输入和输出),但实际计算机编程的结构方式对应于 Lambda(和因此 SKI 和 BCKW),例如递归的想法和调用函数的方式。许多这些编程语言都具有用作函数的 lambda 抽象。

    【讨论】:

      【解决方案2】:

      一切都是为了控制。

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

      这就是 lambda 的用武之地。使用 lambda 可以概括 (grep @ 模式) 要将 grep 应用于任何输入, (grep@X) 但是,我们必须有一种方法来获取 grep 的输入。因此我们通常使用函数。 f(X) = grep @ X 上述过程称为抽象出论点。但是没有理由认为 f 是特殊的,所以我们有它的语法: λ X 。 grep@X 然后 lambda X. grep @ X, 可以应用于输入,输入将被替换到正文中并进行评估。但是,替换可能会变得混乱,绑定变量在机器上实现起来可能很麻烦。 S-K-I(或 B、C、K、W)提供了一种无需替换即可执行 lambda 内容的方法,而只需交换应用程序。

      总而言之,应用就是一切。在将程序应用于某物(可能是另一个程序)的级别进行推理非常方便。 Lambda 演算提供了一种结构化输入和程序对参数的应用的方法。 SKI 提供了一种无需显式替换即可执行 lambda 的方法。

      应该注意,SKI 缩减本质上是惰性的,因此在实际使用 SKI 来构建应用程序时可能需要考虑一些因素。事实上,这些论点现在可能已经被充分评估,也可能是部分应用。人们可以通过类型理论来解决这个问题,并且仅当程序处于应用程序的头部位置时才根据其输入评估程序。即,如果一个人用封闭的 lambda 术语写作,翻译成 SKI, 那么如果 p @ arg1 @ .... 应该是这样的情况,如果 p 是一个原始程序,那么重写已经完成,所以它的所有参数都是 1) 可用的,2) 完全评估的。但是,我还没有证明这一点,如果有足够强大的类型理论,这可能不是真的......

      【讨论】:

        【解决方案3】:

        SKI 和 BCKW 演算与 Lambda 演算(在函数式编程概念中有众所周知的应用)不同,因为它们位于 point-free form。另见tacit programming。它们构成了理解如何在没有命名参数的情况下构造函数式程序的基础。

        我们看到它在某些语言中的应用(例如 JoyCat)。我曾经posted on Lambda-the-Ultimate.org关于SK微积分与Cat and Joy的关系。

        就其价值而言:BCKW 和 SKI(或 SK)微积分几乎相同,但 BCKW 基础已经过时。

        【讨论】:

          【解决方案4】:

          在 Haskell 中,他们是 everywhere!

          • B<$>
          • Cflip
          • Kpure
          • id
          • S<*>
          • Wjoin

          从 Haskell 的角度来看,<$> 的意思是“在上下文中执行”。

          • (+2) <$> (*3) 表示乘以三后加二
          • (+2) <$> [1,2,3] 表示列表中的每个元素都添加两个
          • (+2) <$> (read . getLine) 表示我刚刚读到的数字加二
          • (+2) <$> someParser 表示我刚刚解析的数字加二

          具有上下文的事物称为函子。你所有的 Java/Python/C++ 迭代器都是奇怪的由内而外的仿函数。

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

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

          【讨论】:

          • 这些仅用于函数实例,这很酷,但我不会说 B 字面上的 is 等等。 B 组合子一般(.)(compose),而不是<$>(fmap)——除了funcs的特定情况,如您所示。 K 组合子通常是const,而不是pure(同样,fns 的特定情况除外)。 W 仅用于 fns 的 join,而不是任何任意 monad。 (对于所有一般情况,C = 翻转和 I = id 都成立。)也许这是迂腐的。恕我直言,您的回复很好,但严格来说,我会添加一个注释,例如“专门针对功能:”或类似内容。
          猜你喜欢
          • 1970-01-01
          • 2016-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-14
          • 2015-01-28
          相关资源
          最近更新 更多