2017-03-20 7 views
4

注文タイプを必要とする私の順序付きトリプルデータ型(OrdTriple)上にマップする可能性のある関数の型に制約を適用するために、Fine-Grained Functorクラスを定義しました(FgFunctor)。ファンクタのスーパータイプに競合するインスタンスがあります

import Data.List (sort) 

-- 'fine-grained' functor 
class FgFunctor f a b where 
    fgmap :: (a -> b) -> f a -> f b 

data OrdTriple a = OrdTriple a a a deriving Show 

instance (Ord a, Ord b) => FgFunctor OrdTriple a b where 
    fgmap f (OrdTriple n d x) = OrdTriple n' d' x' 
     where [n', d', x'] = sort [f n, f d, f x] 

main :: IO() 
main = do 
    let test = fgmap (* 10^4) $ OrdTriple 1 6 11 
    print test 

私はそうのように、またFgFunctor sと他のすべてのFunctor Sを定義するまで、コードが正常に動作します:できるだけ早く私はOrdTriplefgmapを使用しようとして、そのインスタンス宣言で

-- all regular functors are also fine-grained ones 
instance Functor f => FgFunctor f a b where 
    fgmap = fmap 

コンパイラは重複するインスタンス宣言について文句を言います

Overlapping instances for FgFunctor OrdTriple b0 b0 
    arising from a use of ‘fgmap’ 
Matching instances: 
    instance Functor f => FgFunctor f a b 
    -- Defined at OrdTriple.hs:15:10 
    instance (Ord a, Ord b) => FgFunctor OrdTriple a b 
    -- Defined at OrdTriple.hs:18:10 
In the expression: fgmap (* 10^4) 
In the expression: fgmap (* 10^4) $ OrdTriple 1 6 11 
In an equation for ‘test’: 
    test = fgmap (* 10^4) $ OrdTriple 1 6 11 

ただし、最初の '一致するインスタンス'はOrdTripleには適用しないでください.OrdTripleFunctorではありません。そのため、重複の原因となっているものを特定するのは苦労しています。

+0

関連仕事も参照してください。最も簡単な方法は、ほとんどの実践的なアプローチは['MonoFunctor'](http://hackage.haskell.org/package/mono-traversable-1.0.2/docs/Data-MonoTraversable.html#t:MonoFunctor)です。これは一般的なインスタンスを派生しません。私の[Constrained.Functor'](http://hackage.haskell.org/package/constrained-categories-0.3.0.1/docs/Control-Functor-Constrained.html)のような一般化/制約付きカテゴリ理論ライブラリのFunctorクラス#t:Functor)、prelude-functorから派生したインスタンスにあいまいなタグ(作業するカテゴリ)を与えることで、問題を解決します。 – leftaroundabout

+0

'MonoTraversible'型は、マップされると、常に同じ型の' MonoTraversible'を返します。だから '(f(xs :: t)):: t'は' f'と 'x'のすべての正当な組み合わせに対してですか? –

+0

はい、そのクラスは実際にはかなり限定的です。 – leftaroundabout

答えて

5

コンパイラ(GHC)が特定の型の型クラスのインスタンスを探すとき、各インスタンスのコンテキストを考慮に入れません。だからOrdTripleFunctorのインスタンスではないにもかかわらず、のインスタンスがOrdTripleの2つのインスタンスが見つかったのです。

GHC/AdvancedOverlapは、この状況をどのように解決できるかを示しています。

関連する問題