Agda 和 Idris 都有效禁止类型Type
的值匹配。似乎Agda总是在第一种情况下匹配,而Idris只是抛出一个错误。
那么,为什么typecase是一件坏事呢?它会破坏一致性吗?我还没有找到关于这个主题的更多信息。
答案 0 :(得分:47)
人们认为类型上的模式匹配很糟糕,这真的很奇怪。每当我们进行宇宙构建时,我们在编码类型的数据上进行模式匹配会获得很多好处。如果你采用Thorsten Altenkirch和我开创的方法(以及我的同志和我开始设计的那些方法),这些类型确实形成了一个封闭的宇宙,所以你甚至不需要解决(坦率地说)值得解决的问题)用open数据类型计算将类型视为数据的问题。如果我们可以直接模式匹配类型,我们就不需要解码函数来将类型代码映射到它们的含义,这最大程度地减少了混乱,并且最多减少了通过关于解码行为的等式定律来证明和强制的需要。功能。我打算用这种方式建立一个无中间人封闭式理论。当然,您需要0级类型居住在1级数据类型中。当你构建一个归纳 - 递归的宇宙层次结构时,这当然是理所当然的。
但是我听到你问的是参数化怎么样?
首先,当我尝试编写类型通用代码时,我不想要参数化。不要强迫我参与。
其次,为什么类型应该是我们参与的唯一事物?我们为什么不有时在其他东西中参数化,例如,居住在数据类型但我们不希望在运行时没有的完全普通的类型索引?仅仅因为它们的类型而被迫存在的数量只是在规范中起作用的数量才是真正的麻烦。
域的类型什么都不与它的量化是否应该是参数化的。
让我们(例如由Bernardy和朋友提出的)一个学科,其中参数/可擦除和非参数/匹配量化都是不同的并且都是可用的。然后类型可以是数据,我们仍然可以说出我们的意思。
答案 1 :(得分:14)
许多人认为类型匹配不好,因为它打破了类型的参数化。
在具有类型参数的语言中,当您看到变量时
f : forall a . a -> a
您立即对f
的可能值有很多了解。直觉:由于f
是一个函数,因此可以写成:
f x = body
正文必须属于a
类型,但a
未知,因此a
类型的唯一可用值为x
。如果语言允许不确定,f
也可以循环。但是它可以根据x
的值在循环或返回x
之间做出选择吗?不,因为a
未知,f
不知道要在x
上调用哪些函数才能做出决定。因此,实际上只有两个选项:f x = x
和f x = f x
。这是关于f
行为的一个强有力的定理,我们通过查看f
的类型得到这个定理。类似的推理适用于具有普遍量化类型变量的所有类型。
现在,如果f
在a
类型上匹配,则f
的更多实现是可能的。所以我们会失去强大的定理。
答案 2 :(得分:1)
在Agda中,您无法在Set
上进行模式匹配,因为它不是归纳类型。