13

私はこれを持っています

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は導出できません。なんで?

4

2 に答える 2

13

Generic Programming に関する GHC ドキュメントを参照してください。
任意の型のジェネリック表現で機能するクラスを作成する必要があります。あなたが与えた特定の例は、派生クラスにとって合理的ではないと思います。

于 2013-02-07T16:26:59.333 に答える
13

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は便利です。これらは通常、特定の型クラスに異なる動作を提供するため、または型システムを使用して同じ型でコード内の用途が異なるものを分離する方法として使用されるためです。

于 2013-02-07T16:08:40.333 に答える