3

Bool私は、次のように親切なレベルに昇格できることを理解していBoolます。TrueFalse

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}

type family TF t :: Bool
type instance TF Int = True
type instance TF Bool = False

代わりに宣伝したかっ()たのですが、もちろんこれには 1 つの値しかありません()。しかし、これはうまくいかないようです:

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}

type family TF t :: ()
type instance TF Int = ()
type instance TF Bool = ()

Boolandをそのまま使用できると思いますTrueが、種類レベルに昇格できる 1 つの値の型はありますか?

4

1 に答える 1

6

型レベルでは'()なく使用してみてください:()

type family ToNull t :: ()
type instance ToNull Int = '()
type instance ToNull Bool = '()

またTrueFalse実際には型レベルで'Trueandの短縮形です。'False

問題は()、スコープに 4 つあることです。

  1. 普通()のタイプ*
  2. 1 の唯一のコンストラクターであり、()
  3. ()1から昇格した種類
  4. デフォルトで型シノニムを持つ、2 からプロモートされた'()kindの型()()

場合によってはオプションの一重引用符がないと、1 と 4 があいまいになります。

詳細については、GHC のユーザー ガイドを参照してください: 7.9. データ型昇格

于 2016-02-28T13:20:53.870 に答える