- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在阅读 Haskell wiki 上的页面 type arithmetic并且在类型系统中嵌入的 lambda 演算部分遇到了一些麻烦。从该部分中,我了解到以下代码不应该与 GHC/GHCi 一起使用 - 显然 GHC 不应该能够确定 g 的类型签名。
{-# OPTIONS -fglasgow-exts #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
data X
data App t u
data Lam t
class Subst s t u | s t -> u
instance Subst X u u
instance (Subst s u s', Subst t u t') => Subst (App s t) u (App s' t')
instance Subst (Lam t) u (Lam t)
class Apply s t u | s t -> u
instance (Subst s t u, Eval u u') => Apply (Lam s) t u'
class Eval t u | t -> u
instance Eval X X
instance Eval (Lam t) (Lam t)
instance (Eval s s', Apply s' t u) => Eval (App s t) u
f :: Eval (App (Lam X) X) u => u
f = undefined
g :: Eval (App (Lam (App X X )) (Lam (App X X ))) u => u
g = undefined
请注意,我必须添加FlexibleContexts 和UndecidableInstances,因为如果没有这些扩展,给定的代码似乎无法编译。但是,当我使用 GHCi(版本 8.0.2)运行此命令时,我得到以下结果:
*Main> :t f
f :: X
*Main> :t g
g :: u
这对我来说特别奇怪,因为类型 u 还没有在任何地方定义。这是上面两种语言扩展相互交互和 glasgow-exts 交互的结果吗?如果是这样,怎么办?
最佳答案
类型u
只是一个单独的类型变量——就像undefined::a
中的a
一样。
要真正将其归结为最基本的要素,请考虑这个备用文件:
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE FlexibleInstances #-}
class Loopy a
instance Loopy a => Loopy a
x :: Loopy a => a
x = undefined
如果您在 ghci 中询问 x
的类型,它会告诉您它的类型为 a
,但没有上下文。这可能看起来有点神奇;您只需认识到 GHC 中的实例解析完全可以递归,并且实现会竭尽全力支持这一点。
如果您愿意,我们可以详细了解您的示例中发生的情况,但它与上面的文件非常相似。以下是详细信息。
所以,我们想看看是否允许我们拥有这个实例:
Eval (App (Lam (App X X)) (Lam (App X X))) u
我们知道
instance (Eval s s', Apply s' t u) => Eval (App s t) u
所以只要我们同时拥有这两者,我们就可以拥有它:
Eval (Lam (App X X)) s'
Apply s' (Lam (App X X)) u
第一个很简单,因为:
instance Eval (Lam t) (Lam t)
因此,当我们满足以下条件时,我们就可以享用蛋糕:
Apply (Lam (App X X)) (Lam (App X X)) u
自从
instance (Subst s t u, Eval u u') => Apply (Lam s) t u'
要找到我们的蛋糕,我们应该检查这两 block 岩石下面:
Subst (App X X) (Lam (App X X)) u
Eval u u'
来自
instance (Subst s u s', Subst t u t') => Subst (App s t) u (App s' t')
我们知道什么时候可以吃蛋糕
Subst X (Lam (App X X)) s'
Subst X (Lam (App X X)) t'
Eval (App s' t') u'
这很容易取得进展,因为:
instance Subst X u u
因此,我们可以在以下任何时候拥有原始实例:
Eval (App (Lam (App X X)) (Lam (App X X))) u'
但是,嘿,快点!这是我们正在寻找的原始实例。总之,只要我们能够拥有原始实例,我们就可以拥有原始实例。所以我们声明我们可以拥有我们的原始实例,然后我们就可以拥有我们的原始实例!这不是桃子吗?
关于Haskell 类型级 lambda 演算错误(或缺乏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45315886/
(图1) 简单类型 lambda 演算的一部分(图 1),它在 Haskell 中实现,如下所示。 evaluate expression = do case expression
在 Tom Stuart 的《Understanding Computation》一书中,有一章专门介绍通过 Procs/Lambdas 重建 FizzBuzz。他首先讨论了如何通过过程定义数字,
在 lambda 演算中 (λ x. λ y. λ s. λ z. x s (y s z)) 用于添加两个 Church 数字,我们如何解释这一点,是否有用于函数式编程的 lambda 演算的任何好的
好的,所以我正在尝试实现 basics of lambda calculus .就到这里了。 我的号码: def zero[Z](s: Z => Z)(z: Z): Z = z def one[Z](
我一直在尝试在 C# 上实现原始 lambda 演算,但在实现它时遇到了一些麻烦,因为最后,我总是被要求提供对象。 例如,我想要一些可以让我定义一些基本逻辑组合子的东西,例如 I = Lambda x
我在 Haskell 编程中的冒险并不都是史诗般的。我正在实现简单的 Lambda 演算,我很高兴完成了语法、评估以及替换,希望它们是正确的。剩下的就是红色框中定义的打字(如下图所示),我正在寻找指导
如何扩展简单类型的 lambda 演算以拥有支持类似 monad 类型的类型系统?基本上,我目前对简单类型的 lambda 演算有了很好的理解,并且我想了解将 monad 添加到该基础的“最低要求”。
在 lambda 演算中,如果一个项具有范式,则正常的降阶策略将始终产生它。 我只是想知道如何严格证明上述命题? 最佳答案 您提到的结果是所谓的标准化定理的推论,指出对于任何归约序列 M->N,在相同
在 OCaml 中,“fun”似乎是我的绑定(bind)运算符。 OCaml 有内置替换吗?如果有,它是如何实现的?它是使用 de Bruijn 索引实现的吗? 只是想知道如何在 OCaml 中实现无
在 Haskell 中实现按值调用 lambda 演算时,我是否应该强制对对象语言中函数的参数求值(即按值调用 lambda 演算)来绕过调用 -元语言(即 Haskell)的按需求值顺序? 具体来说
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
为什么纯无类型 lambda 演算经常被描述为无法使用? 有了合适的函数库,它会不会与任何其他函数式语言大致相同? 最佳答案 速度不是大问题。例如,您可以决定使用教堂数字但优化实现,以便像往常一样表示
我正在将一些我在 python 中制作原型(prototype)的代码移植到闪存中,而 actionscript 并没有我预期的那么糟糕(我听说 v3 比 v2 好很多!)我还有一些东西这样做似乎过于
有人告诉我这个词 (z (λy.z x) (λy.y z)) 已经是正常形式了——但我不明白为什么。不能在这种状态下进行另一个 beta 缩减,并将术语 (λy.z x) 中所有出现的 y 替换为 (
Haskell 和 Lambda 演算中的 Python 代码是什么? def f1(): x = 77 def f2(): print x f2 f1 我在 lambd
我想用不同的编程语言实现 bool 值和 NOT 运算符的 lambda 演算构造。 它们是: TRUE = lx.ly. x FALSE = lx.ly. y NOT = lx. x FALSE T
使用 JavaScript。让我们定义以下内容: M = f => f(f) // Mocking Bird I = a => a // Identity 假设现在我们写这个表达式 M( f =>
我一直在玩 javascript(节点)中的 lambda 演算。 我创建了一些 Church 数字,并且一直在尝试创建一个计算斐波那契数列的递归函数,但它绝对行不通! 我曾尝试将函数包装在 Y 组合
我必须为 > 、 , != 编者注:我认为这就是 OP 试图提出的问题: 我正在尝试使用 Church 编码在无类型 lambda 演算中实现以下操作: 大于(GT 或 >)。 小于(LT 或 、
可以解释 Haskell 中的 lambda 演算: data Expr = Var String | Lam String Expr | App Expr Expr data Value a = V
我是一名优秀的程序员,十分优秀!