Luquiは、この件に関する私のブログ投稿にリンクしました。基本的に、GeneralizedNewtypeDeriving
GHC で実装されているように、 はある種の同型 (すなわち、 によって暗示される操作的に無関係な同型newtype
) がライプニッツの等式を意味すると仮定しています。これは、Haskell 98 ではある程度当てはまりましたが、Haskell と拡張機能ではまったく当てはまりません。
つまり、newtype は関数のペアを提供します。
a -> b
b -> a
コアでは何もしませんが、結論としては問題ありません
forall f. f a -> f b
f
型関数または GADT である可能性があるためです。これが必要な平等の形式ですGeneralizedNewtypeDeriving
Haskell 98 でさえ、モジュール境界を壊します。あなたは次のようなものを持つことができます
class FromIntMap a where
fromIntMap :: Map Int b -> Map a b
instance FromIntMap Int where
fromIntMap = id
newtype WrapInt = WrapInt Int deriving FromIntMap
instance Ord WrapInt where
WrapInt a <= WrapInt b = b <= a
悪いことをするもの...
私のブログ投稿では、unsafeCoerce
他の拡張機能 (すべて安全) を使用していくつかの方法を実装する方法を示しGeneralizedNewtypeDeriving.
ており、なぜこれが現在なのかをよりよく理解しており、「システム FC」スタイルの拡張機能 (type familes、type familes GeneralizedNewtypeDeriving
、unsafeCoerce
GADT)。シル、それは安全ではなく、使用する場合は注意して使用する必要があります. 私の理解では、Lennart Augustsson (ユーザー augustss) が hbc で非常に異なる方法で実装し、この実装は安全でした。安全な実装はより制限され、より複雑になります。
更新: GHC の十分な新しいバージョン (すべての問題は 7.8.1 の時点で解消されているはずです)では、新しいロール システムGeneralizedNewtypeDeriving
により安全です。