型クラスと関数従属性を使用して、たとえば次のコードで変換できる型関数を取得し、次に示すように別の型クラスで使用しようとし ています。Int
Cont Int
{-# LANGUAGE KindSignatures, FunctionalDependencies, FlexibleInstances, FlexibleContexts #-}
newtype TestData a b = TestData b
newtype Cont a = Cont a
class TypeConv (repr :: * -> *) a b | repr a -> b where
class Lift repr a where
liftOp :: (TypeConv repr a a') => a -> repr a'
instance TypeConv (TestData a) Int (Cont Int) where
instance Lift (TestData a) Int where
liftOp i = TestData (Cont i)
そして、これがghci7.4.2のエラーです
src/Test.hs:13:26:
Could not deduce (a' ~ Cont Int)
from the context (Full (TestData a) Int a')
bound by the type signature for
liftOp :: Full (TestData a) Int a' => Int -> TestData a a'
at src/Test.hs:13:5-32
a' is a rigid type variable bound by
the type signature for
liftOp :: Full (TestData a) Int a' => Int -> TestData a a'
at src/Test.hs:13:5
In the return type of a call of `Cont'
In the first argument of `TestData', namely `(Cont i)'
In the expression: TestData (Cont i)
TypeConv
型クラスに私が読んだ基金があるとすると、「与えられてrepr
、a
私たちは推測することができb
ます」そしてインスタンスを提供しましたInt
、なぜghcはそれを推測できないのa' ~ Cont Int
ですか?