编辑:我发现如果我直接内联t1
的定义,那么这种类型检查就好了。因此,似乎定义将t1视为一个未知变量而不是我之前的实际定义。有没有办法强迫这个?
前言:我完全意识到这不是写这个的惯用方法。我只是想明白这里发生了什么。
我编写了一个二叉树和函数elemBT
的简单实现,它检查树是否包含特定元素并计算为布尔值(想想Haskell的elem
函数,二进制树除外)。
t1 : BT Nat
t1 = Node 5 Nil Nil
elemBT : Eq a => a -> BT a -> Bool
> elemBT 5 t1
True : Bool
既然我知道elemBT评估为True
,我希望能够写一个非常简单的陈述,通过以下方式证明这一点。
t1contains5 : elemBT 5 t1 = True
t1contains5 = Refl
出乎意料的是,这会导致统一失败。但是,我能够使用内置列表完成相同的操作。
junk : elem 5 [1,5] = True
junk = Refl
此类型按预期进行检查。为什么我的二叉树示例不能以相同的方式工作?
感谢。
答案 0 :(得分:4)
我自己解决了这个问题。事实证明,在最近的某个时候(可能是2015年末),对Idris进行了更改,将任何小写,可能隐式变量视为隐含变量。如果我把T1大写,那么这个问题就完全消失了。
中有一些进一步的讨论