【发布时间】:2019-02-13 07:55:53
【问题描述】:
考虑一个接受 Set 并返回其字节长度的函数,命名为byteLength:
byteLength : Set -> Maybe Nat
如果我想直接实现这个函数,我需要对类型参数进行模式匹配:
byteLength Char = Just 1
byteLength Double = Just 8
byteLength _ = Nothing
但上述代码无法编译,因为不允许在 Set/Type 上进行模式匹配。
所以我们必须定义一个接口作为解决方法
Interface ByteLength a where
byteLength : Nat
implement ByteLength Char where
byteLength = 1
并且以更一般的方式,也许我们可以使用 TypeRep 之类的东西来做类似的事情并在 TypeRep 上进行模式匹配。但是 TypeRep 也被定义为一个接口。
我认为使用 Interface 和使用 forall 是非常不同的,因为 Interface 意味着“对于某些类型”,而 forall 意味着“对于所有类型”。
我想知道为什么这些 DT 语言不支持 Set/Type 上的模式匹配,是否有一些我不知道的特殊原因?
【问题讨论】:
-
相关question