考虑一个接受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也被定义为一个接口。
我认为使用接口和使用forall是非常不同的,因为接口意味着“对于某些类型”,而forall意味着“对于所有类型”。
我想知道为什么这些DT语言不支持对Set/Type进行模式匹配,是否有一些我不知道的特殊原因?