- 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/
我不明白为什么我的 Java 代码没有出现错误。我有一个使用泛型类型的类: import java.util.*; // For ArrayList public class Hat { pub
我正在 Pygame 中开发一款射击类游戏供我自己娱乐,在创建玩家的基本 Action 的过程中我遇到了一些疑问,“Dash”和“Switch”均未按预期工作。 ... def switch(self
当我加载一个显示的网页时,为什么我要为每个图像的 HTTP 请求打开一个新的 TCP 连接?为什么在页面加载期间不重复使用单个 TCP 连接? 最佳答案 我认为浏览器通常会打开多个连接,以便它可以并行
我一直在谷歌搜索,只能找到 a trivial example Compute Capability 3.0 中的新动态并行性在其链接的其中一份技术简报中介绍 from here .我知道 HPC 专
我使用 Telerik 和 Microsoft CDN,分别用于它们各自的 AJAX 工具包。两者在 99% 的情况下都工作得很好。然而,我最近在两家不同的咖啡馆工作并访问了我的网站:第一家咖啡馆不允
我在一家从事网络托管的 IT 公司工作,而且我个人对 SQL 非常缺乏经验*。 *看起来很糟糕 我的一个客户正在尝试将 Epos 系统与其 magento 网站集成,在 Epos 集成过程中,他们遇到
我的代码现在有一个循环,它调用蒙特卡洛函数来计算多个样本的简单积分(y=x,从 0 到 1),并将总时间和积分值写入文本文件。然后循环增加线程数并继续前进。现在大约有 8 个线程,时间峰值约为 2.6
所以 HTTP/2 增加了我想要利用的性能。出于各种原因,我不喜欢连接我的 javascript,而 HTTP/2 无论如何都会使它变得不必要。 但是。我正在开发一个将部署在客户本地网络中的网络应用程
我写了一个非常简单的 Haskell 程序: main = print $ sum $ map read ["55", "99", "101"] 鉴于我过去的经验,我预计会得到一个“歧义类型”错误,因
我是一名优秀的程序员,十分优秀!