- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正在关注 this tutorial ,我有以下代码:
{-# LANGUAGE DataKinds, TypeFamilies #-}
data Nat = Z | S Nat
type family Plus (n :: Nat) (m :: Nat) :: Nat
type instance Plus Z m = m
type instance Plus (S n) m = S (Plus n m)
到目前为止一切顺利。我知道 DataKinds
会自动将类型提升为种类,而 TypeFamilies
会启用类型级函数。
然后我添加:
type family Mul (m :: Nat) (n :: Nat) :: Nat
type instance Mul Z m = Z
type instance Mul (S n) m = Plus m (Mul n m)
编译给我:
Nested type family application
in the type family application: Plus m (Mul n m)
(Use UndecidableInstances to permit this)
In the type instance declaration for ‘Mul’
这个扩展的名字很吓人。有人说要avoid它,以及我试过阅读的关于这个扩展的解释对我来说没有意义。
寻求一些帮助来理解错误,为什么它会出现在这个例子中,undecidable 在这种情况下的含义是什么,以及在什么情况下这个扩展和它一样可怕声音?
最佳答案
其实并不可怕。它禁用试图确定类型族和实例定义终止的(相当弱的)GHC 检查。因此,其最坏情况下的行为是非终止类型检查。然而,大多数情况下我们得到的是错误消息而不是实际的循环,因为循环经常超出类型检查器中的堆栈限制。我们不会得到不安全、不连贯或任何其他可能对程序稳健性或推理产生不利影响的属性。
“Undecidable”可能是一个比保证更强烈的表达,因为它只表示 GHC 无法决定定义是否正在终止。在许多情况下,GHC 对于这项工作来说太弱了,而其他依赖语言的编译器将能够毫无问题地检查终止。对于 GHC,UndecidableInstances
通常也需要明显的终止定义,在这种情况下,它的使用是非常合理的。
关于haskell - 类型级 Peano 数和 UndecidableInstances,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37219566/
考虑以下代码示例: {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE UndecidableInstances #-} -- Is there a way
是的,我知道 UndecidableInstances可能很糟糕。我真的很努力地设计我的模块,以便它不需要它但是我有这样的东西: instance Foo x (C x y) => Bar (C x
我有一个 UndecidableInstances我无法弄清楚如何避免使用 newtype 的问题.这是我最初的: {-# LANGUAGE TypeFamilies, FlexibleContext
我写了一些需要 -XUndecidableInstances 来编译的 Haskell 代码。我确实理解为什么会发生这种情况,因为违反了某个条件,因此 GHC 大喊大叫。 但是,我从未遇到过类型检查器
我是 Haskell 新手,只是玩了一段时间。 我编写了一个轻量级的 OOP 模拟: --OOP.hs {-# LANGUAGE MultiParamTypeClasses, FlexibleIn
我想在库中做一些魔术,允许多态地解构产品类型。这是一个或多或少的工作模型,说明了我想做的事情: {-# LANGUAGE MultiParamTypeClasses, FunctionalDepend
在之前使用 UndecidableInstances 编写一些代码时,我遇到了一些我觉得很奇怪的东西。我无意中创建了一些我认为不应该进行类型检查的代码: {-# LANGUAGE FlexibleIn
假设 Haskell 库设计者决定使用 UndecidableInstances 由于某些原因。该库编译良好。现在假设某个程序使用该库(例如定义其类型类的一些实例),但不使用扩展。编译失败(不会终止)
在 GHC 8.0.1 中,我尝试为类型级列表实现类型级 Length 函数。它编译: {-# LANGUAGE DataKinds, TypeOperators, TypeFamilies #-}
正在关注 this tutorial ,我有以下代码: {-# LANGUAGE DataKinds, TypeFamilies #-} data Nat = Z | S Nat type famil
我知道the documentation for -XUndecidableInstances ,但我想我会要求详细说明。 假设我有两个多参数类型类(-XMultiParamTypeClasses 允
我一直在尝试了解免费的 monad;作为学习辅助工具,我成功地为以下 Free 类型编写了一个 Show 实例: {-# LANGUAGE FlexibleContexts, UndecidableI
我是一名优秀的程序员,十分优秀!