idris - 为什么 Idris 将值名称与随后定义的类型参数名称混为一谈?

标签 idris

Haskell 允许:

a:: Int 
a = 3
data MyList a = Nil | Cons a (MyList a) 

而 idris 会提示 a is bound as an implicit ,
我需要使用不同类型的参数:
a: Int 
a = 3
data MyList b = Nil | Cons b (MyList b)

最佳答案

实际上,Idris 并没有在这里将它们混为一谈,因为 a是小写。但它可以——除了 Haskell——因为它支持类型中的值。因此编译器会警告您,因为这是错误的常见来源。假设你写:

n : Nat
n = 3

doNothing : Vect n Int -> Vect n Int
doNothing xs = xs

您可能期望 doNothing的类型是 Vect 3 Int -> Vect 3 Int .而是 lower case arguments are bound to be implicitdoNothing的类型实际上是 {n : Nat} -> Vect n Int -> Vect n Int ,尽管之前声明 n .你必须写 Vect Main.n Int或制作 N大写来使用它。

所以编译器认为也许你想做一些与 a 类似的事情。在 MyList a并警告你。

关于idris - 为什么 Idris 将值名称与随后定义的类型参数名称混为一谈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50205398/

相关文章:

idris - 我如何说服 Idris 中的总体检查器我没有使用变量?

parsing - 在 Idris 中使用类型谓词生成运行时证明

overloading - 为什么这些表达有不同程度的歧义?

agda - Idris 是否与 Agda 的 `_` 表达式等效?

enums - 在 Idris 中,如何将 1 添加到 Fin 直到达到 "max"

haskell - 是否有可能推导出教堂编码的 Nat 的归纳法?

coq - 如何在 Idris/Agda/Coq 中模式匹配多个值?

dependent-type - 依赖类型的功能不是全部的,但 idris 认为它​​是全部的

lazy-evaluation - idris 真的是 "strictly evaluated?"

idris - 我怎样才能让 Idris 相信我的功能正在覆盖?