【发布时间】:2022-01-13 05:44:18
【问题描述】:
我是 lambda 演算的新手,我发现语法有时对我来说模棱两可。 具体来说,我想知道如何理解 Z 组合器:
Z = λ f. (λ x. f (λ v. xxv)) (λ x. f (λ v. xxv))
如何在 OCaml 中编写它? 更新: 像这样写时出现错误:
fun f-> let g = fun x -> f(fun v-> x x v)in g g;;
错误:此表达式的类型为 'a -> 'b -> 'c 但是需要一个类型为 'a 的表达式 类型变量 'a 出现在 'a -> 'b -> 'c
【问题讨论】:
-
您觉得有什么歧义?语法直接转换为 OCaml(但在这种情况下它不会进行类型检查,除非您将选项
-rectypes传递给 OCaml)。您唯一需要了解的是构造λ x, …的含义。你肯定知道如何用 OCaml 语法表达同样的概念。 -
我想知道在哪里加括号,例如:does λ x. f (λ v. xxv) 均值 (λ x. f) (λ v. xxv) 或 λ x。 (f (λ v. xxv))? λ v. xxv 是指 λ v. (xxv) 还是 (λ v. x)xv ?
-
您不需要对括号进行任何更改。
-
当我写 fun f -> let g = fun x -> f fun v -> x x v in g g;;在 ocaml 中存在语法错误。
-
确实,与 lambda 演算表达式相比,您已经删除了括号:写
f (fun v -> ...)而不是f fun v -> ...。所以你的问题真的是 OCaml 的语法,而不是 lambda 演算的语法。
标签: ocaml lambda-calculus