问题标签 [k-combinator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
31 浏览

control-flow - 如何在 ReasonML 中创建一系列动作中间表达式(并避免创建元组)?

如果给出不合适的参数,我想尽早退出函数Javascript中的命令式解决方案很优雅:

ReasonML 作为一种函数式语言没有return,因此我将所有内容都填充到单个表达式中:

现在,这行得通,但不是只返回 42 我想填充Js.Log("!CORNER CASE!"). 我怎样才能做到这一点?在 C 中,我可以编写(arg>limit) ? (Js_Log("..."),42) : helper(),但在 ReasonML 中,这变成了一个元组并且无法编译。

OCaml 可以begin printf "msg" ; 42 end,但分号在原因中对我不起作用:(Js.log("TEST");42)- 无法编译!

或者,我需要 ReasonML 中的 K-combinator。

0 投票
1 回答
83 浏览

lambda-calculus - SKS是否等于SKK?

语境

昨晚我开始自学 lambda 演算,我试图确定我到目前为止所理解的是否正确。

理解

SKK 等价于 Identity 组合器,I。

其中 L 代表 lambda:

S = LxLyLz((xz)(yz))

K = LxLy(x)

K 基本上采用接下来的 2 (lambda) 项并返回其中的第一个。S 在无类型 lambda 演算中似乎更复杂一些。

我的解释

SK(any-lambda-term) 也等价于 I。

即应用 S 到 K 到 Any-lambda-term 的应用等价于 Identity 组合子:

((SK)(任何)) = I = SKK = ((SK)(K))

如果有帮助的话,我在上面的符号中使用了“左关联”的约定(我试图在上面的第 4 项中用括号明确表示。到目前为止我所读的所有内容似乎都使用了这个约定)。

推理

SK = LyLz((K z)(yz))

下一个 lambda 项将替换 y,设该项为 Y。

天空 = Lz((K z)(Y z))

(Y z) 是 Y 对 z 的应用,也是一个 lambda 项。(K z) 返回返回 z 的常数函数,给定另一个项输入:(Y z)。

我的解释是真的吗?如果不是,你能解释一下吗?我将不胜感激。特别是如果可以解释某种操作顺序——我在考虑何时评估时经常会感到困惑。也许这将通过实践来完善。