Wen使用函数依赖,我经常达到Coverage条件.可以使用UndecidableInstances解除它,但我通常会尝试远离该扩展. 这是一个有点人为的例子,没有UndecidableInstances就可以了: {-# Language MultiParamTypeClass
这是一个有点人为的例子,没有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
当我使结果类型更通用时,Coverage条件失败(因此需要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(可能与类型系列?)的情况下对上述场景进行建模吗?