関数の依存関係を使用すると、頻繁に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
(おそらく型ファミリを使用しますか?)