我不知道我怎么没注意到这一点,但数据构造函数和函数定义都不能使用除*
以外的其他类型的类型及其变体* -> *
等{,由于(->)
的亲切签名,即使在-XPolyKinds
下也是如此。
以下是我尝试的代码:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
data Nat = S Nat | Z
data Foo where
Foo :: 'Z -> Foo -- Fails
foo :: 'Z -> Int -- Fails
foo _ = 1
我得到的错误如下:
<interactive>:8:12:
Expected a type, but ‘Z’ has kind ‘Nat’
In the type signature for ‘foo’: foo :: 'Z -> Int
为什么我们不允许与非传统类型进行模式匹配?
答案 0 :(得分:4)
没有 1 之类的东西,如“*
以外的种类”。对于类型,种类*
种类,就像机器大小的数字的Int
是 类型一样;其他类型可能包含类似于类型的东西,或者可以转换为类型或用于索引类型或其他类型的东西 - 但不是类型,仅仅是“类型级实体”。
1 通常,我在这里忽略了unbox-kind。