data Lam = Func (Lam -> Lam)
trueChurch :: Lam
trueChurch = Func (\x -> Func (\y -> x))
falseChurch :: Lam
falseChurch = Func (\x -> Func (\y -> y))
lamUnfold :: Lam -> (Lam -> Lam)
lamUnfold (Func f) = f
部分答案可能来自领域理论。如果我理解正确的话,lam->lam
的元素并不全是集合论函数(根据康托定理,这些函数比lam
大),而只是连续函数。如果是,定义这种连续性的拓扑是什么?为什么LAM->LAM
类型的Haskell术语对它是连续的?
也许解决这个悖论的最简单的方法是观察并不是每一个(集合论的)函数都可以表示为一个λ项。
每一个有效的lambda项都可以通过从一个至多可数的集合中选择有限数量的语法产生物,并将它们至多有限地应用多次而得到。因此,所有lambda项的集合是可数集的可数并集,因此它本身是可数的。0参数透明地应用于Haskell类型:获得lam
类型项的唯一方法是调用构造函数,在任何给定的时间点,即使程序没有终止,构造函数也只能被调用有限次。因此,在整个执行过程中,程序最多可能遇到无限多个不同的LAM
值。在实践中,考虑到计算机内存有限,你的程序实际上能够操纵的项数会少一点。
集合--理论上,没有什么能阻止你把通过抛硬币无数次获得的比特串视为一个有效的函数→它满足了函数的集合理论定义,因为它给域的每一个元素(比特串中的位置)指定了共域的一个元素(抛硬币的结果)。但是假定构造这样一个函数需要做出无限多的任意选择1,它就没有相应的λ项。
没有必要调用像连续性这样复杂的概念。上面所有的内容都是基于基数本身的考虑,同时注意lambda术语(以及Haskell中的类型术语)来自哪里。
0如果从变量的不可数符号集开始,从技术上讲,这是错误的。但即使这样,你也可以选择一个可数的无限个λ项子集,在这个子集上,每个λ项都是α-等价的。如果使用de bru n索引而不是变量符号,这个问题也会消失。
1当然,假设掷硬币确实是不确定和独立的。
我现在被困在实现“alpha-同余”(在一些教科书中也被称为“alpha-等价”或“alpha-相等”)上。我希望能够检查两个λ表达式是否相等。例如,如果我在解释器中输入以下表达式,它应该得到True(用于指示lambda符号): 问题在于理解下列λ表达式是否被认为是alpha等价的: 在的情况下,我猜答案是。这是因为和,两者的右侧是相等的(其中符号用于表示alpha缩减)。 简而言之,如何实现函
我在Haskell编程中的冒险并不都是史诗般的。我正在实现简单的Lambda演算,我很高兴完成了、以及,希望它们是正确的。剩下的是,就像红色框中定义的那样(在下图中),我正在为此寻找指导。 如果我说错了请指正, (1)但是我发现返回给定变量的类型。Haskell中的什么构造返回?我知道在中是,但我正在寻找一个在下工作的。 (3)对于(T-APP)和(T-ABS),我假设我分别对和应用程序应用了替换
这些到底有什么区别呢?我想我理解存在类型是如何工作的,它们就像OO中的基类没有向下强制转换的方法一样。通用类型有何不同?
其中是用于定义替换的函数。 然而,当我试图使用beta约简来约简表达式时,我得到了一个非穷举模式错误,我不明白为什么。我能做的修复它是在底部添加一个额外的大小写,如下所示: 但是,如果我这样做了,那么lambda表达式根本不会被缩减,这意味着函数的输入和输出是相同的。 如果使用第一个函数而不添加最后一个大小写,则为非穷尽模式 或完全相同的表达式App(ABS1(ABS2(VAR1)))(VAR3)
问题内容: 我是C ++ / Java程序员,在日常编程中碰巧使用的主要范例是OOP。在某个线程中,我读到一条评论,即Type类本质上比OOP更直观。有人可以用简单的词来解释类型类的概念,以便像我这样的OOP家伙可以理解吗? 问题答案: 首先,我总是非常怀疑这种程序结构更直观。编程是违反直觉的,并且总是会因为人们自然而然地根据特定情况而不是一般规则来思考。要更改此设置,需要培训和实践,也称为“编程