14

プラグマは、{-# UNPACK #-}冗長なコンストラクターを削除するようにコンパイラーに指示します。Haskell wikiの引用:

たとえば、次のようになります。

data T = T {-# UNPACK #-} !(Int,Float)

GHC は型 T を次のように表現します。

data T = T Int Float

タプルを削除します。これは一般的に、ボックス化されていない Int をコンストラクターに直接配置するために使用されます。

data T = T {-# UNPACK #-} !Int

として表されます

data T = T Int#

アンパックするフィールドがポリモーフィックな場合でも、これは機能しますか? たとえば、私が定義した場合

data S' a   = S String {-# UNPACK #-} !a

type S1     = S' Int
newtype S2  = S2 (S' Int)

S1で動作する、またはS2最適化される機能はありますか?

4

1 に答える 1

11

開梱に関するドンのブログからの引用

ポリモーフィック フィールドには可変サイズがあり、コンパイラは (非常に特殊な状況を除いて) 使用されている型に関する情報にアクセスできないため、これは意味がありません。

また、Tibell のメーリング リストへの返信を読むこともできます。

残念ながら、展開はポリモーフィック フィールドでは機能しません (GHC ヘッドの無効な unpack プラグマに関する新しい警告は、これについて警告する必要があります) ...

于 2012-10-27T08:16:01.677 に答える