注文タイプを必要とする私の順序付きトリプルデータ型(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を定義するまで、コードが正常に動作します:できるだけ早く私はOrdTriple
にfgmap
を使用しようとして、そのインスタンス宣言で
-- 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
には適用しないでください.OrdTriple
はFunctor
ではありません。そのため、重複の原因となっているものを特定するのは苦労しています。
関連仕事も参照してください。最も簡単な方法は、ほとんどの実践的なアプローチは['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
'MonoTraversible'型は、マップされると、常に同じ型の' MonoTraversible'を返します。だから '(f(xs :: t)):: t'は' f'と 'x'のすべての正当な組み合わせに対してですか? –
はい、そのクラスは実際にはかなり限定的です。 – leftaroundabout