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