我只阅读了标准教程并且摸索了一下,所以我可能会遗漏一些简单的东西。
如果这在 Idris 中是不可能的,请解释原因。此外,如果可以用另一种语言完成,请提供代码示例并解释使之成为可能的该语言类型系统的不同之处。
这是我的方法。问题首先出现在第三部分。
创建一个已知类型的空列表
v : List Nat
v = []
这在 REPL 中编译并显示为[] : List Nat
. 优秀的。
泛化到任何提供的类型
emptyList : (t : Type) -> List t
emptyList t = []
v' : List Nat
v' = emptyList Nat
不出所料,这有效并且v' == v
.
Ord
将类型约束到类的实例
emptyListOfOrds : Ord t => (t : Type) -> List t
emptyListOfOrds t = []
v'' : List Nat
v'' = emptyListOfOrds Nat -- !!! typecheck failure
最后一行失败并出现此错误:
When elaborating right hand side of v'':
Can't resolve type class Ord t
Nat
是 的一个实例Ord
,那么有什么问题呢?我尝试将Nat
sv''
替换为Bool
(不是 的实例Ord
),但错误没有变化。
另一个角度...
使Ord t
显式参数满足类型检查器吗?显然不是,但即使它确实要求调用者传递冗余信息也不理想。
emptyListOfOrds' : Ord t -> (t : Type) -> List t
emptyListOfOrds' a b = []
v''' : List Nat
v''' = emptyListOfOrds (Ord Nat) Nat -- !!! typecheck failure
这次错误更详细:
When elaborating right hand side of v''':
When elaborating an application of function stackoverflow.emptyListOfOrds':
Can't unify
Type
with
Ord t
Specifically:
Can't unify
Type
with
Ord t
我可能错过了一些关于如何根据类型声明检查值的关键见解。