问题标签 [church-encoding]
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.
ocaml - OCaml 的类型系统是否会阻止它对 Church 数字进行建模?
作为消磨时间,我正在尝试解决我在大学学习的课程(涉及 Lambda 微积分和各种编程概念)中提出的各种问题。因此,我正在尝试在 OCaml 中实现 Church 数字和相关运算符(也作为 OCaml 中的练习)。
这是到目前为止的代码:
因此,它似乎有效,但随后就崩溃了。让我们考虑这些定义:
我知道抛出的错误与 Church 数字在定义时的类型多态性有关(参见SO question),然后在调用闭包一次后解决。但是,我似乎不明白为什么在这种情况下会引发类型不一致错误:
有什么想法吗?
具体错误:
1.
2.
javascript - Church 编码的总和类型是无类型语言中的适当替代方案吗?
我一直在为 Javascript 中的 sum 类型的想法苦苦挣扎。该语言既不包括本机求和类型,也不包括模式匹配。虽然您可以使用普通的旧 Javascript 和原型系统来模拟 sum 类型,Object
并引入一种原始形式的模式匹配(鸭子类型和分支 via switch
),但这种方法很乏味,而且结果看起来一点也不惯用 - 至少在我看来。
所以我想出了使用教堂编码来表达和类型的想法——但是,不是以严格的方式,即允许条件运算符等语言特性。我将选项类型实现为练习:
首先,我不确定这是否是正确的实现。除此之外,还有两件事困扰着我:
- 我不确定是否有适用于所有可能场景的默认值。
""
是String
s 的中性元素 - 但是对于任何类型,是否存在像中性或零这样的元素? - 因为
head
现在返回一个二进制函数,它不再是可组合的
除此之外,我发现这种方法非常有前途,因为它完全依赖于高阶函数,并且不引入花哨的新类型,这些新类型在某种程度上与语言格格不入。
Chruch 编码只是一个很好的智力挑战,还是能够解决实际问题的技术?
对不起,如果这个问题太宽泛或太混乱或两者兼而有之,但我觉得自己陷入了死胡同。
functional-programming - 使用高阶逻辑定义“对”的概念
修改自动推理课程,我不太明白如何回答这个问题:
展示如何(x, y)
使用 lambda 抽象在高阶逻辑中定义对的概念。定义一个函数 π1,它返回这种对的第一个元素。最后,证明π1(x, y) = x.
我在 stackoverflow 上发现了类似的问题,但它们都与我从未使用过的方案有关。英文/相关数学符号的解释将不胜感激
haskell - 我可以基于 Church 编码和 Rank-N 类型的存在来实现异构列表吗?
在我尝试理解存在类型时,我读到 Church 编码以及 Rank-N 类型扩展足以在没有存在量化的情况下在 Haskell 中对它们进行编码。我发现了这个简单的例子:
在 Haskell Wiki 中,我偶然发现了以下基于存在类型的异构列表示例:
现在我尝试用 Church 来表达这个实现,但由于非法多态类型错误而失败:
我想这个翻译很简略,完全是错误的。存在类型可以用 Church/Rank-N 编码吗?它是如何正确完成的?
haskell - 使用 Church 数字键入一些操作的签名声明
我试图在 Haskell 中实现 Church 数字。这是我的代码:
我的问题来自求幂。toNumeral
如果我声明and的类型签名exp
,则代码不会编译。但是,如果我评论类型签名声明,一切正常。toNumeral
和的正确声明是exp
什么?
lambda - 如何在 lambda 演算中定义正负整数和有理数
我正在研究 lambda 演算,但只有基本知识。我阅读了许多网站和论文,了解逻辑(T/F/和/或)、谓词和后继的工作方式,但我不知道如何使用这个 lambda 演算在编程中完成其他事情。
我想知道如何通过在 lambda 演算中使用自然数和有理数对作为整数对来定义正整数和负整数。
谢谢您的帮助。
functional-programming - lambda 演算 xor 表达式 by true false
我试图在 lambda 演算的上下文中理解 xor。我将 xor(异或)理解为https://en.wikipedia.org/wiki/Exclusive_or中的布尔逻辑运算 和异或的真值表。
但是为什么它是来自http://safalra.com/lambda-calculus/boolean-logic/的 xor b=(a)((b)(false)(true))(b) 是真的期望在 lambda 演算中。当我看到 true=λab.a false=λab.b 时,我不得不将 true 和 false 视为 lambda calc true 和 false,因为它在 true 的情况下返回第一个元素。但是理解这里的异或也是一个名字但与布尔逻辑中的异或不同是否正确?
haskell - 幂函数 Haskell
如何使用 Haskell 获得教堂数字中的幂函数?
我正在尝试应用规则,即 λxy.yx 但有些东西不能正常工作。
haskell - Church naturals、指数函数和类型检查
我在 lambda 演算中对自然数的定义如下,这是我的主要目标。
然后,下一步是定义运算churchSum
符churchMul
和churchExp
。
很好,它可以工作,前两个函数很容易推导出来,但求幂则不然。至少对我来说。为了进一步了解,我对 lambda 项进行了 beta 归一化:
(λf.λx. f(f x))(λf.λx f(f x))
有效地查看幂运算是正确的。
所以,我的问题是:我怎么能在不知道的情况下推断出这个 lambda 项?更重要的是,为什么要λ> churchTwo churchTwo
检查Haskell
类型何时是类型λ> churchTwo :: (b -> b) -> b -> b
?在它里面做函数的 beta 归一化吗?
haskell - Church 编码转换函数无法使用 GADT 编译
下面的to_c
函数由于类型错误而被拒绝,因为在使用我想用于此处未显示的不相关代码片段的 GADTs 扩展进行编译时。
错误信息:
我可以以直接递归的方式重写函数,该函数将进行类型检查并且也可以工作;但是,我很好奇为什么这种迭代方法有缺陷,以及是否可以通过一些巧妙的类型注释来挽救它。