问题标签 [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.
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。
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)。
我的解释是真的吗?如果不是,你能解释一下吗?我将不胜感激。特别是如果可以解释某种操作顺序——我在考虑何时评估时经常会感到困惑。也许这将通过实践来完善。