不寻常的种类和数据构造函数
Unusual Kinds and Data Constructors
我不知道我怎么没注意到这一点,但是数据构造函数和函数定义之类的不能使用 *
以外的类型及其变体 * -> *
等,由于 (->)
的亲切签名,即使在 -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
为什么我们不允许与非传统类型进行模式匹配?
没有1个"types with kinds other than *
"。 *
是类型的 类型,很像 Int
是机器大小数字的 类型;其他种类可能包含类似于类型或可以转换为类型或用于索引类型或其他任何东西的东西 – 但不是 类型本身 ,仅仅是 "type level entities".
1像往常一样,我在这里忽略拆箱种类。
我不知道我怎么没注意到这一点,但是数据构造函数和函数定义之类的不能使用 *
以外的类型及其变体 * -> *
等,由于 (->)
的亲切签名,即使在 -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
为什么我们不允许与非传统类型进行模式匹配?
没有1个"types with kinds other than *
"。 *
是类型的 类型,很像 Int
是机器大小数字的 类型;其他种类可能包含类似于类型或可以转换为类型或用于索引类型或其他任何东西的东西 – 但不是 类型本身 ,仅仅是 "type level entities".
1像往常一样,我在这里忽略拆箱种类。