- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
也许这是一个愚蠢的问题。这是来自 the Hasochism paper 的引用:
One approach to resolving this issue is to encode lemmas, given by parameterised equations, as Haskell functions. In general, such lemmas may be encoded as functions of type:
∀ x1 ... xn. Natty x1 → ... → Natty xn → ((l ~ r) ⇒ t) → t
我以为我理解了 RankNTypes
,但我无法理解这个命题的最后部分。我将其非正式地解读为“给定一个需要 l ~ r
的术语,返回该术语”。我确信这种解释是错误的,因为它似乎会导致循环:在证明本身得出结论之前我们不知道 l ~ r,所以我怎么能期望提供作为证明的假设需要一个术语?
我希望相等性证明具有更像这样的类型:
Natty x1 → ... → Natty xn → l :~: r
非正式地说,“给定一堆 Natty
,返回 l
和 r
相等的命题证明”(使用 GHC 的Data.Type.Equality)。这对我来说更有意义,并且似乎与您在其他依赖类型系统中所说的一致。我猜它与论文中的版本相同,但我正在努力在心理上平衡这两个版本。
简而言之,我很困惑。我觉得我错过了一个关键的见解。我应该如何读取类型 ((l ~ r) => t) -> t
?
最佳答案
I'm reading it as "given a term which requires
l ~ r
, return that term"
它是“给定一个类型包含 l
的术语,返回该术语,并将所有 l
替换为类型中的 r
”(或在另一个方向 r -> l
)。这是一个非常巧妙的技巧,允许您委托(delegate)所有 cong
, trans
, subst
以及与 GHC 类似的东西。
这是一个例子:
{-# LANGUAGE GADTs, DataKinds, PolyKinds, TypeFamilies, TypeOperators, RankNTypes #-}
data Nat = Z | S Nat
data Natty n where
Zy :: Natty Z
Sy :: Natty n -> Natty (S n)
data Vec a n where
Nil :: Vec a Z
Cons :: a -> Vec a n -> Vec a (S n)
type family (n :: Nat) :+ (m :: Nat) :: Nat where
Z :+ m = m
(S n) :+ m = S (n :+ m)
assoc :: Natty n -> Natty m -> Natty p -> (((n :+ m) :+ p) ~ (n :+ (m :+ p)) => t) -> t
assoc Zy my py t = t
assoc (Sy ny) my py t = assoc ny my py t
coerce :: Natty n -> Natty m -> Natty p -> Vec a ((n :+ m) :+ p) -> Vec a (n :+ (m :+ p))
coerce ny my py xs = assoc ny my py xs
更新
特化是有启发性的assoc
:
assoc' :: Natty n -> Natty m -> Natty p ->
(((n :+ m) :+ p) ~ (n :+ (m :+ p)) => Vec a (n :+ (m :+ p)))
-> Vec a (n :+ (m :+ p))
assoc' Zy my py t = t
assoc' (Sy ny) my py t = assoc ny my py t
coerce' :: Natty n -> Natty m -> Natty p -> Vec a ((n :+ m) :+ p) -> Vec a (n :+ (m :+ p))
coerce' ny my py xs = assoc' ny my py xs
丹尼尔·瓦格纳在评论中解释了发生的事情:
Or, to say it another way, you can read ((l ~ r) => t) -> t as, "given a term that is well typed assuming that l ~ r, return that same term from a context where we have proven l ~ r and discharged that assumption".
让我们详细说明证明部分。
在 assoc' Zy my py t = t
案例n
等于Zy
因此我们有
((Zy :+ m) :+ p) ~ (Zy :+ (m :+ p))
减少为
(m :+ p) ~ (m :+ p)
这显然是恒等式,因此我们可以解除该假设并返回 t
.
在每个递归步骤中,我们都维护
((n :+ m) :+ p) ~ (n :+ (m :+ p))
方程。那么当 assoc' (Sy ny) my py t = assoc ny my py t
等式变为
((Sy n :+ m) :+ p) ~ (Sy n :+ (m :+ p))
减少为
Sy ((n :+ m) :+ p) ~ Sy (n :+ (m :+ p))
由于 (:+)
的定义。由于构造函数是单射的
constructors_are_injective :: S n ~ S m => Vec a n -> Vec a m
constructors_are_injective xs = xs
等式变为
((n :+ m) :+ p) ~ (n :+ (m :+ p))
我们可以调用 assoc'
递归地。
终于接到coerce'
的电话了这两个术语是统一的:
1. ((n :+ m) :+ p) ~ (n :+ (m :+ p)) => Vec a (n :+ (m :+ p))
2. Vec a ((n :+ m) :+ p)
显然Vec a ((n :+ m) :+ p)
是 Vec a (n :+ (m :+ p))
假设((n :+ m) :+ p) ~ (n :+ (m :+ p))
.
关于haskell - "lemma"函数的一般类型应该如何理解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30224796/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!