4

なぜこれに気付かなかったのかはわかりませんが、データ コンストラクターと関数定義は同様に、の種類の署名により、 の種類の下でも、*バリアント* -> *などの種類以外の型を使用できません。(->)-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

非伝統的な種類とのパターン マッチングを許可してはならないのはなぜですか?

4

1 に答える 1

4

「種類以外の種類」というものは一つもありませ*。Kind*は型種類であり、機械サイズの数値型とよく似Intています。他の種類には、型に似たもの、型に変換できるもの、または型などのインデックスに使用されるものが含まれる場合がありますが、型そのものではなく単に「型レベルのエンティティ」です。


1いつものように、ここでは unbox-kind を無視します。

于 2015-01-13T15:17:26.643 に答える