プラグマは、{-# 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
最適化される機能はありますか?