不寻常的种类和数据构造

时间:2015-01-13 14:42:50

标签: haskell polymorphism dependent-type data-kinds type-kinds

我不知道我怎么没注意到这一点,但数据构造函数和函数定义都不能使用除*以外的其他类型的类型及其变体* -> *等{,由于(->)的亲切签名,即使在-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 个答案:

答案 0 :(得分:4)

没有 1 之类的东西,如“*以外的种类”。对于类型,种类* 种类,就像机器大小的数字的Int 类型一样;其他类型可能包含类似于类型的东西,或者可以转换为类型或用于索引类型或其他类型的东西 - 但不是类型,仅仅是“类型级实体”。


1 通常,我在这里忽略了unbox-kind。