5

私は Haskell に比較的慣れていないので、 HListの定義の 1 つを理解しようとしています。

data instance HList '[] = HNil
newtype instance HList (x ': xs) = HCons1 (x, HList xs)
pattern HCons x xs = HCons1 (x, xs)

具体的な質問がいくつかあります。

  • '[]私が見ているとの(x ': xs)構文は何ですか? 可変引数型パラメーターのパターン マッチングのように見えますが、この構文を見たことがなく、Haskell の可変引数型パラメーターに精通していません。これはGHC の Type Families の一部だと思いますが、リンクされたページにはこれについて何も表示されず、Google で構文を検索するのはかなり困難です。

  • のボクシングを避ける以外に、(2 つのフィールドnewtypeを持つ宣言の代わりに) タプルを持つ宣言を使用する意味はありますか?dataHCons1

4

2 に答える 2

8

まず、定義の一部、つまりdata family宣言自体が欠落しています。

data family HList (l :: [*])
data instance HList '[] = HNil
newtype instance HList (x ': xs) = HCons1 (x, HList xs)

これは(拡張子data familyの下で利用可能) と呼ばれます。TypeFamilies

pattern HCons x xs = HCons1 (x, xs)

これは双方向パターンです (PatternSynonyms拡張機能で利用可能)。

'[]私が見ているとの(x ': xs)構文は何ですか?

'コンストラクターの前にマークが表示されている場合、それは、昇格された型レベルの対応物を示すためのものです。構文上の便宜上、プロモートされたリストとタプルも余分なティックが必要です (そして'[]、空の型レベル リストと':型レベル コンスに対しても記述できます。これらはすべて、DataKinds拡張機能を介して利用できます。

newtypeのボクシングを避ける以外に、(2 つのフィールドを持つデータ宣言の代わりに) タプルを持つ宣言を使用する意味はありHCons1ますか?

はい、それは がHList代表的な役割HListを持っていることを確認することです。つまり、 s 1間で強制できることを意味します。これは少し複雑すぎて答えだけで説明することはできませんが、これは私たちが望むように物事が進まない例です。

 data instance HList (x ': xs) = HCons x (HList xs)

newtype instance(およびパターンなし)の代わりに。、、 とそれぞれnewtype表現上同等である次の を考えてみましょう。IntBool()

newtype MyInt = MyInt Int
newtype MyBool = MyBool Bool
newtype MyUnit = MyUnit ()

coerceこれらの型を自動的にラップまたはアンラップするために使用できることを思い出してください。まあ、同じことができるようにしたいのですが、全体的にはHList:

ghci> l  = (HCons 3 (HCons True (HCons () HNil))) :: HList '[Int,   Bool,   ()]
ghci> l' = coerce l                               :: HList '[MyInt, MyBool, MyUnit]

これはバリアントでは機能しますが、役割のためにバリアントでは機能しnewtype instanceません。data instance(詳細はこちら。)


1技術的には、全体として a の役割はありません。役割は/data familyごとに異なる可能性があります。ここでは、ケースが強​​制されるため、表現である必要があるだけです。この Trac チケット をチェックしてくださいinstancenewtypeHCons

于 2016-12-14T05:48:40.693 に答える
2

'[]andは、言語拡張によって型を kind に、コンストラクタを types に昇格させることができる(x ': xs)という意味で、型レベルのリストの構文です。つまり、 ifはある種であり、 thenも一種であり、は kind の型であり、 ifおよび、 then . すべてが 1 つずれます。DataKindsk'[k]'[]'[k]t :: kts :: '[k]t ': ts :: '[k]

では、HList (x ': xs)2つの型xに一致します。kind の「通常の」型(例: ) に一致し、kind の別の型レベルのリストに一致します。右側は、 type のパラメーターを持つコンストラクターを持つ ( ) データ型を定義します。xsx*Intxs'[*]newtypeHCons1(x, HList xs)

例として、

HCons1 (1, HCons1 (True, HNil)) :: HList '[Int, Bool]

または、パターン シノニムを使用します。

1 `HCons` True `HCons` HNil :: HList '[Int, Bool]

タプルを持つ newtype として表される理由に関する 2 番目の質問に対する適切な回答がありません。

于 2016-12-14T05:16:59.330 に答える