2017-12-18 29 views
9

例えば、私は型クラスを持っている:Haskellでは、部分的に適用されたマルチパラメータ型クラスのデフォルト実装を提供することは可能ですか?

class MyClass a b c where 
    fun01 :: a -> b 
    fun02 :: a -> c 

    fun03 :: a -> b -> c ->() 
    fun04 :: a -> WhatEver 

私は私のためのデフォルトの実装を提供したい、のは、それが自己とfun01fun02の面でfun03の実装を定義するBaseDataTypeそれを呼びましょう。私はちょうどこのようfun01fun02を提供したい

class MyClass BaseDataType b c where 
    fun03 = fun01 <$> fun02 ... 
    fun04 = fun02 ... 

そして、私のクラスのインスタンスを確定し、fun03fun04のためのすべての定型的なコードを避けるために、より:

instance MyClass BaseDataType Int Char where 
    fun01 = 1 
    fun02 = 'C' 
それから私はこのような何かを持っていると思います

この種の動作を可能にする言語拡張がありますか?私はこのトピックについて何も見つけることができませんでした。

答えて

10

そこには、このような拡張機能はありませんが、あなたは二つのクラスにクラスを分割することにより、この機能を簡単に実現することができます。

-- NB: need the MyClass2 constraint if you use `fun01` or `fun02` in the definitions 
-- This requires UndecidableInstances 
instance MyClass2 BaseDataType b c => MyClass1 BaseDataType b c where 
    fun03 = fun01 <$> fun02 ... 
    fun04 = fun02 ... 

instance MyClass2 BaseDataType Int Char where 
    fun01 = 1 
    fun02 = 'C' 

ユーザー:次に、あなたの場合は、あなたが望むように動作します

class MyClass1 a b c where 
    fun03 :: a -> b -> c ->() 
    fun04 :: a -> WhatEver 

class MyClass1 a b c => MyClass2 a b c where  
    fun01 :: a -> b 
    fun02 :: a -> c 

あなたのクラスのあなたは影響を受けません。前もってMyClassを使用していて、まったく同じ機能を得るには、彼らはMyClass2を消費し続けることができます。別に


:でも、いくつかのあいまいなタイプのエラーが原因でコンパイルしないMyClass、およびMyClass1MyClass2の本来の定義(cfun01の種類等に記載されていません) - 私は、このクラスだったと仮定しますデモンストレーション目的のためだけに定義されており、私はこれを修正しようとしていません。

4

あなたはこの

class MyClass a b c where 
    fun01 :: a -> b 
    fun02 :: a -> c 

    fun03 :: a -> b -> c ->() 
    default fun03 :: (a ~ BaseDataType) => a -> b -> c ->() 
    fun03 = fun01 <$> fun02 ... 

    fun04 :: a -> WhatEver 
    default fun04 :: (a ~ BaseDataType) => a -> WhatEver 
    fun04 = fun02 ... 
+2

1のようなDefaultSignaturesを使用することができますが、デフォルトではなく、単に 'MyClassのBaseDataType'ため_for ALL_' MyClass'インスタンス、ですので、私は、これはOPのためにusuableで数えるません専門化。 (他のケースでは、既定の実装では、カスタムインスタンスを置き換える必要があることを示すために、あいまいな型のエラーが表示されます)。 – leftaroundabout

関連する問題