Haskell类型级别平等

时间:2017-07-24 09:57:01

标签: haskell type-level-computation

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 的旧时代,类型级别模式匹配似乎与统一类似。 我没有成功地搜索有关类型级函数语法的一些文档。

  • 为什么GHC在 Contains 类型系列的定义中不需要类似 a~b 类型的等式约束?
  • 类型相等是否始终可用?
  • 类型系列语法是否具有值级别不可用的其他附加功能?
  • 这在哪里记录?

1 个答案:

答案 0 :(得分:17)

Haskell的类型级语言是纯粹的一阶语言,其中“application”只是另一个构造函数,而不是计算的东西。有绑定结构,如forall,但类型级别东西的相等概念基本上只是alpha等价:结构直到绑定变量的重命名。实际上,我们的构造函数级机器,monad等等都依赖于能够明确地将应用程序m v分开。

类型级函数并不像一等公民那样生活在类型级语言中:只有他们的完整应用程序才能。我们最终得到了类型级表达式的等式(对于~平等概念)理论,其中表达和求解约束,但这些表达式表示的的基本概念是总是一阶的,因而总是能够平等。

因此,通过结构相等性测试解释重复模式变量总是有意义的,这正是模式匹配在其原始的1969年版本中的设计,作为根植于一个基本的一阶价值概念的另一种语言的扩展, LISP。