Haskell的语法对于定义类型族有限制:
(1) type family Length (xs :: [*]) where
(2) Length '[] = 0
(3) Length (x ': xs) = 1 + Length xs
在等号(=)左侧的第(2)和第(3)行,我们只有简单的模式匹配。在等号右侧,我们只有类型级函数应用,而作为一种语法糖,
有类型运算符((+)在第(3)行)。没有保护程序,没有情况表达式,没有if-then-else语法,没有let和where,并且没有部分函数应用。 这不是问题,因为缺少的情况表达式可以由专门的类型级函数替换,该函数在不同情况下进行模式匹配, 缺失的if-then-else语法可以由Data.Type.Bool包的If函数替换。
从一些示例中我们可以看到,类型级别的模式匹配语法至少具有一个普通Haskell值级函数中不可用的附加功能:
(1) type family Contains (lst :: [a]) (elem :: a) where
(2) Contains (x ': xs) (x) = 'True
(3) Contains '[] (x) = 'False
(4) Contains (x ': xs) (y) = Contains xs (y)
在第二行中,我们使用变量x的两倍。 第二行的求值结果为'True',如果第一个参数的列表的头与第二个参数相等。
如果我们在一个值级别的函数上做同样的事情,GHC会返回一个Conflicting definitions for 'x'
错误。
在值级别的函数中,我们必须添加一个Eq a =>
上下文才能编译该函数。
类型级别的模式匹配似乎与早期的Prolog中的unification类似工作。 我尝试谷歌一些关于类型级别函数语法的文档,但没有成功。
- 为什么GHC在Contains类型族的定义中不需要类似a ~ b的类型相等约束?
- 类型相等是否总是可用的?
- 类型族语法是否具有其他在值级别不可用的附加功能?
- 这在哪里记录?