Foo
関数を所有するというクラスがありますgen :: Int -> [Foo]
。Foo
たとえば、その方法でインスタンスを作成できます。
data FooTest = FooTest Int
instance Foo FooTest where
gen n = replicate n (FooTest 0)
Bar
ここで、関数を定義するという別のクラスがあると想像してみましょうbar :: Bar -> IO ()
。の各インスタンスはのインスタンスでFoo
ある必要がありますが、実装は各インスタンスでまったく同じです。次に例を示します。Bar
Bar
class Foo f where
gen :: Int -> [f]
class Bar b where
bar :: b -> IO ()
instance Bar Foo where -- obviously that doesn’t work
bar _ = putStrLn "bar through any Foo instance"
instance (Foo f) => Bar f where -- this needs the FlexibleInstance GHC extension first, then it still throws shit saying that the constraint is not smaller that I don’t shit
bar _ = putStrLn "bar through any Foo instance"
ここでの問題は、最初のクラスのインスタンスが他のクラスをインスタンス化するために同じ実装を共有するという事実に言及するために、クラスを別のインスタンスにする方法を見つけることができないことです。
何か案が?
前もって感謝します。