问题标签 [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.

0 投票
1 回答
339 浏览

haskell - 教会编码(条件)

我正在尝试写出一些 lambda 演算,但我无法让教堂条件起作用。我可能应该说我是一个 Haskell 菜鸟。

我已经在网上和 SO 上查看了解决方案,但它们都涉及引入新类型和其他技巧,但我希望尽可能接近原始语法。例如:

匹配教堂布尔值的确切语法:

有什么方法可以匹配教堂 if/else 的确切语法?我正在尝试复制\p.\a.\b.p a b,但我不确定我做错了什么:

0 投票
1 回答
275 浏览

haskell - 是否可以使用迭代增量对键入的 Church 数字实现加法?

我找不到将加法定义为重复递增的方法,尽管这在无类型语言中是可能的。这是我的代码:

我得到的编译错误add2

为什么这是一个错误?不是Church那个的同义词((a->a) -> a -> a)吗?

0 投票
1 回答
2186 浏览

python - 在 python 中使用 lambda 函数添​​加教堂数字

我正在尝试使用基于 SICP 的在线课程自学 Python 和 CS。我了解教堂数字的基础知识,但是在 python 中使用 lambda 函数添​​加教堂数字时遇到了麻烦。

这是我的上下文代码:

这是我遇到问题的 add_church 函数:

我得出的结论是,添加教堂数字的一种方法是以某种方式让 add_church(m, n) 中的一个函数成为另一个 lambda 函数中的输入或“x”。但是,我不断收到错误,表明我在函数调用中没有使用正确的参数。

例如,当我打电话时:

我得到一个“int object not callable”错误,并且还尝试了其他不同的方法但没有成功。

我认为我没有看到关于 lambda 函数的一些东西,这导致我在实现 add_church 时遇到了麻烦。我已经花了一段时间来解决这个问题,所以任何能引导我找到答案的帮助都将不胜感激。

0 投票
1 回答
335 浏览

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次吗?

0 投票
2 回答
509 浏览

recursion - Sml Church 数字类型推断

我在 SML 中有这个表达式,需要找到它最通用的类​​型。通过编译器运行时,我得到下面显示的内容。我将如何找到最通用的类​​型,不仅是这个函数,还有其他函数,比如教堂数字函数“二”。

为什么是这个类型:

0 投票
2 回答
714 浏览

java - 如何使用 Java 1.8 实现教堂数字

我正在尝试在 Java 1.8 中实现教堂数字。我的第一次尝试是:

这失败了,因为函数方法有一个类型参数。(具体来说,带有 lambda 表达式的行给出了错误:“非法 lambda 表达式:ChurchNumeral 类型的方法应用是通用的”。)

根据对使用泛型和功能接口的相关问题的回答,我尝试对类进行参数化:

第一个 lambda 表达式现在可以编译,但第二个失败并出现以下错误:

ChurchNumeral 类型中的方法 apply(UnaryOperator, capture#1-of ?) 不适用于参数 (UnaryOperator, Object)

此外,我不想为每个可能的函数/参数类型使用不同版本的 ChurchNumeral.ZERO。

有什么建议么?

0 投票
1 回答
158 浏览

haskell - 是否有任何非递归项可以折叠在斯科特编码列表上?

假设我有一个scott 编码的列表,例如:

我想要一个接收此类列表并将其转换为实际列表([1,2,3])的函数,但此类函数不能递归。也就是说,它必须是 eta-beta 范式。有这个功能吗?

0 投票
4 回答
1482 浏览

haskell - 如何为 Free Monads 使用 Church 编码?

我一直在使用包中的数据Free类型。现在我正在尝试将其转换为使用但不知道如何映射函数。Control.Monad.FreefreeFControl.Monad.Free.Church

例如,一个简单的模式匹配函数使用Free如下所示 -

F我可以轻松地将其转换为通过转换为/从使用的函数Free-

但是我不知道如何在不使用toF和的情况下完成它fromF-

一定有一个我缺少的一般模式。你能帮我弄清楚吗?

0 投票
1 回答
400 浏览

haskell - Church 编码列表的变态

我希望能够catarecursion-schemes包中使用 Church 编码中的列表。

为方便起见,我使用了第二等级类型,但我不在乎。如果您认为有必要,请随意添加newtype、使用 GADT 等。

Church 编码的想法广为人知且简单:

基本上是“抽象的未指定”cons并且nil被用来代替“普通”的构造函数。我相信一切都可以用这种方式编码(Maybe、树等)。

很容易证明它List1确实与普通列表同构:

所以它的基础仿函数与列表相同,应该可以实现project它并使用recursion-schemes.

但我不能,所以我的问题是“我该怎么做?”。对于普通列表,我可以进行模式匹配:

由于我无法对函数进行模式匹配,因此我必须使用折叠来解构列表。project我可以为普通列表编写一个基于折叠的:

但是,我未能将其改编为 Church 编码列表:

cata具有以下签名:

要将它与我的列表一起使用,我需要:

  1. 使用声明列表的基本函子类型type family instance Base (ListC a) = ListF a
  2. 实施instance Recursive (List a) where project = ...

我在两个步骤中都失败了。

0 投票
3 回答
305 浏览

list - 是否可以在不破坏等式推理的情况下使用教堂编码?

注意这个程序:

和的两个定义与等式推理相同。然而,编译作品的第二个定义,但第一个没有,出现此错误:

似乎RankNTypes打破了等式推理。有没有办法在 Haskell 中拥有教堂编码列表而不会破坏它?