5

タプルはこのための自然なタイプであると考えているため、タプルで複数の値を収集することがよくあります。ただし、タプルは厳密ではありません。だから考えて

data A

data B =
    B !A

data C =
    C !(B, B)

data D =
    D !B !B

および最適化により-funbox-strict-fields、UNPACK はネストされます。のタプルは のCようにアンパックさC A AれますかD、それとも単にC B Bですか? GHC-doc のリファレンスは次のとおりです: 7.16. プラグマ

(空でないタプルはですか? 型コンストラクターですか?)

4

1 に答える 1

6

検討:

data B = B !Int

data C = C !(B, B)

data D = D !B !B

b0 = B 7
b1 = B 4

c = C (b0, b1)

d = D b0 b1

どこ

data (,) a b = (a,b)

GHC は入れ子になった厳密なコンストラクターを喜んで消去(!B)し、最初のフィールドで C を厳密にし、次のように最適化します。

b0 = B 7
b1 = B 4

c = C b0 b1

d = D 7 4

しかし、重要なのは、(,)それ自身のフィールドは厳密ではないということです -- そのため、GHC はそれらをアンパックできません。さらに、それらはポリモーフィックであるため、strict であっても展開できません。

最初の部分の回避策は、厳密なタプルを使用することです。2 番目の部分の回避策は、自己特化型のタプル(タプルを特化した型ファミリなど) を使用することです。


このスタイルの構文にタプルを使用すると、オーバーヘッドが発生することに注意してください。最適化して取り除く必要があるレベルの間接性が導入されます。そのため、それはいくぶん一元的です。

于 2012-04-18T20:34:48.720 に答える