なぜこれに気付かなかったのかはわかりませんが、データ コンストラクターと関数定義は同様に、の種類の署名により、 の種類の下でも、*
バリアント* -> *
などの種類以外の型を使用できません。(->)
-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
非伝統的な種類とのパターン マッチングを許可してはならないのはなぜですか?