関数の依存関係を使用すると、頻繁にCoverage Conditionにヒットします。で持ち上げることは可能ですUndecidableInstancesが、私は通常、その延長から離れるようにしています.
これは、なしで動作するやや不自然な例ですUndecidableInstances。
{-# Language MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-}
data Result = Result String
deriving (Eq, Show)
data Arguments a b = Arguments a b
class Applyable a b | a -> b where
apply :: a -> b -> Result
instance Applyable (Arguments a b) (a -> b -> Result) where
(Arguments a b) `apply` f = f a b
結果の型をより一般的なものにすると、カバレッジ条件が失敗します (したがって が必要UndecidableInstancesです)。
{-# Language MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances #-}
data Result a = Result a
deriving (Eq, Show)
data Arguments a b = Arguments a b
class Applyable a b c | a -> b c where
apply :: a -> b -> Result c
instance Applyable (Arguments a b) (a -> b -> Result c) c where
(Arguments a b) `apply` f = f a b
bとcはどちらも によって決定されるaため、より一般的なコードは問題を引き起こさないはずだと考えたので、私の質問:
UndecidableInstancesここでの使用に問題はありますか- 依存せずに上記のシナリオをモデル化できますか
UndecidableInstances(おそらく型ファミリを使用しますか?)