私はこれを持っています
data Something = Something Integer deriving (MyClass, Show)
class MyClass a where
hello :: MyClass a => a -> a
instance MyClass Integer where
hello i = i + 1
main = print . hello $ Something 3
しかし、MyClassは導出できません。なんで?
私はこれを持っています
data Something = Something Integer deriving (MyClass, Show)
class MyClass a where
hello :: MyClass a => a -> a
instance MyClass Integer where
hello i = i + 1
main = print . hello $ Something 3
しかし、MyClassは導出できません。なんで?
Generic Programming に関する GHC ドキュメントを参照してください。
任意の型のジェネリック表現で機能するクラスを作成する必要があります。あなたが与えた特定の例は、派生クラスにとって合理的ではないと思います。
GHC は任意のデータ型のインスタンスを魔法のように導出することはできません。ただし、newtype
宣言が同じ基本型の新しい名前を作成して、
GeneralizedNewtypeDeriving
拡張機能を使用するインスタンスを派生させるという事実を利用できます。したがって、次のようなことができます。
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype Something = Something Integer deriving (MyClass, Show)
class MyClass a where
hello :: MyClass a => a -> a
instance MyClass Integer where
hello i = i + 1
main = print . hello $ Something 3
GHC が新しいインスタンスを導出できない理由は、そのインスタンスが何であるべきかわからないからです。データ型にフィールドが 1 つしかない場合でも、必ずしもそのフィールドと同じであるとは限りません。s のインスタンスを派生させる機能newtype
は便利です。これらは通常、特定の型クラスに異なる動作を提供するため、または型システムを使用して同じ型でコード内の用途が異なるものを分離する方法として使用されるためです。