问题标签 [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.
haskell - 教会编码(条件)
我正在尝试写出一些 lambda 演算,但我无法让教堂条件起作用。我可能应该说我是一个 Haskell 菜鸟。
我已经在网上和 SO 上查看了解决方案,但它们都涉及引入新类型和其他技巧,但我希望尽可能接近原始语法。例如:
匹配教堂布尔值的确切语法:
有什么方法可以匹配教堂 if/else 的确切语法?我正在尝试复制\p.\a.\b.p a b
,但我不确定我做错了什么:
haskell - 是否可以使用迭代增量对键入的 Church 数字实现加法?
我找不到将加法定义为重复递增的方法,尽管这在无类型语言中是可能的。这是我的代码:
我得到的编译错误add2
是
为什么这是一个错误?不是Church
那个的同义词((a->a) -> a -> a)
吗?
python - 在 python 中使用 lambda 函数添加教堂数字
我正在尝试使用基于 SICP 的在线课程自学 Python 和 CS。我了解教堂数字的基础知识,但是在 python 中使用 lambda 函数添加教堂数字时遇到了麻烦。
这是我的上下文代码:
这是我遇到问题的 add_church 函数:
我得出的结论是,添加教堂数字的一种方法是以某种方式让 add_church(m, n) 中的一个函数成为另一个 lambda 函数中的输入或“x”。但是,我不断收到错误,表明我在函数调用中没有使用正确的参数。
例如,当我打电话时:
我得到一个“int object not callable”错误,并且还尝试了其他不同的方法但没有成功。
我认为我没有看到关于 lambda 函数的一些东西,这导致我在实现 add_church 时遇到了麻烦。我已经花了一段时间来解决这个问题,所以任何能引导我找到答案的帮助都将不胜感激。
scheme - 试图理解 Scheme 中的教堂编码
我试图通过 Scheme 了解教堂编码的整个原则。我想我了解它的基础知识,例如
0 的教堂数字
(定义 c-0 (lambda (f) (lambda (x) x)))
1 的教堂数字
(定义 c-1 (lambda (f) (lambda (x) (fx))))
...并继续将函数应用于 x N 次。
现在我的问题是这一切意味着什么?如果我以 Church-3 为例:
这实际上在做什么?我也只有基本的方案知识,但我什至不明白如何使用该功能?使用 c-3 函数的示例输入是什么?它只是像循环一样应用3次吗?
recursion - Sml Church 数字类型推断
我在 SML 中有这个表达式,需要找到它最通用的类型。通过编译器运行时,我得到下面显示的内容。我将如何找到最通用的类型,不仅是这个函数,还有其他函数,比如教堂数字函数“二”。
为什么是这个类型:
java - 如何使用 Java 1.8 实现教堂数字
我正在尝试在 Java 1.8 中实现教堂数字。我的第一次尝试是:
这失败了,因为函数方法有一个类型参数。(具体来说,带有 lambda 表达式的行给出了错误:“非法 lambda 表达式:ChurchNumeral 类型的方法应用是通用的”。)
根据对使用泛型和功能接口的相关问题的回答,我尝试对类进行参数化:
第一个 lambda 表达式现在可以编译,但第二个失败并出现以下错误:
ChurchNumeral 类型中的方法 apply(UnaryOperator, capture#1-of ?) 不适用于参数 (UnaryOperator, Object)
此外,我不想为每个可能的函数/参数类型使用不同版本的 ChurchNumeral.ZERO。
有什么建议么?
haskell - 是否有任何非递归项可以折叠在斯科特编码列表上?
假设我有一个scott 编码的列表,例如:
我想要一个接收此类列表并将其转换为实际列表([1,2,3]
)的函数,但此类函数不能递归。也就是说,它必须是 eta-beta 范式。有这个功能吗?
haskell - 如何为 Free Monads 使用 Church 编码?
我一直在使用包中的数据Free
类型。现在我正在尝试将其转换为使用但不知道如何映射函数。Control.Monad.Free
free
F
Control.Monad.Free.Church
例如,一个简单的模式匹配函数使用Free
如下所示 -
F
我可以轻松地将其转换为通过转换为/从使用的函数Free
-
但是我不知道如何在不使用toF
和的情况下完成它fromF
-
一定有一个我缺少的一般模式。你能帮我弄清楚吗?
haskell - Church 编码列表的变态
我希望能够cata
从recursion-schemes
包中使用 Church 编码中的列表。
为方便起见,我使用了第二等级类型,但我不在乎。如果您认为有必要,请随意添加newtype
、使用 GADT 等。
Church 编码的想法广为人知且简单:
基本上是“抽象的未指定”cons
并且nil
被用来代替“普通”的构造函数。我相信一切都可以用这种方式编码(Maybe
、树等)。
很容易证明它List1
确实与普通列表同构:
所以它的基础仿函数与列表相同,应该可以实现project
它并使用recursion-schemes
.
但我不能,所以我的问题是“我该怎么做?”。对于普通列表,我可以进行模式匹配:
由于我无法对函数进行模式匹配,因此我必须使用折叠来解构列表。project
我可以为普通列表编写一个基于折叠的:
但是,我未能将其改编为 Church 编码列表:
cata
具有以下签名:
要将它与我的列表一起使用,我需要:
- 使用声明列表的基本函子类型
type family instance Base (ListC a) = ListF a
- 实施
instance Recursive (List a) where project = ...
我在两个步骤中都失败了。
list - 是否可以在不破坏等式推理的情况下使用教堂编码?
注意这个程序:
和的两个定义与等式推理相同。然而,编译作品的第二个定义,但第一个没有,出现此错误:
似乎RankNTypes
打破了等式推理。有没有办法在 Haskell 中拥有教堂编码列表而不会破坏它?