Haskell有一个用于定义类型族的resticted语法:
(1) type family Length (xs :: [*]) where
(2) Length '[] = 0
(3) Length (x ': xs) = 1 + Length xs
在等号(=)左侧的第(2)和(3)行上,我们只有简单的模式匹配。 在等号的右侧,我们只有类型级函数应用程序和语法糖 有类型运算符(第(3)行中的(+))。
没有警卫,没有案例表达式,没有 if-then-else 语法,没有让和其中的 并且没有部分功能应用。 这不是问题,因为缺少的case表达式可以被专门的类型级函数替换, 该模式匹配不同的情况,缺少的 if-then-else语法可以替换为 If Data.Type.Bool的功能 封装
查看我们看到的一些示例,类型级别上的模式匹配语法至少有一个 附加功能,在普通的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)
在第(2)行中,我们使用变量 x 的两倍。如果第一个参数列表的头部,则行(2)计算为“真”
与相等作为第二个参数。
如果我们在值级别函数上执行相同的操作,GHC会回答Conflicting definitions for 'x'
错误。
在值级函数中,我们必须添加Eq a =>
上下文来编译函数。
在 Prolog 的旧时代,类型级别模式匹配似乎与统一类似。 我没有成功地搜索有关类型级函数语法的一些文档。
答案 0 :(得分:17)
Haskell的类型级语言是纯粹的一阶语言,其中“application”只是另一个构造函数,而不是计算的东西。有绑定结构,如forall
,但类型级别东西的相等概念基本上只是alpha等价:结构直到绑定变量的重命名。实际上,我们的构造函数级机器,monad等等都依赖于能够明确地将应用程序m v
分开。
类型级函数并不像一等公民那样生活在类型级语言中:只有他们的完整应用程序才能。我们最终得到了类型级表达式的等式(对于~
平等概念)理论,其中表达和求解约束,但这些表达式表示的值的基本概念是总是一阶的,因而总是能够平等。
因此,通过结构相等性测试解释重复模式变量总是有意义的,这正是模式匹配在其原始的1969年版本中的设计,作为根植于一个基本的一阶价值概念的另一种语言的扩展, LISP。