我不知道我怎么没有注意到这一点,但是数据构造函数和函数定义都不能使用类型以外的类型*
和它的变体* -> *
等,因为(->)
's kind 签名,即使在-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
为什么我们不应该允许非传统类型的模式匹配?