Wen使用功能依赖,我经常点击覆盖条件。可以使用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
(可能是类型系列吗?)答案 0 :(得分:7)
没有什么理由远离UndecidableInstances
。可能发生的最糟糕的情况是类型检查器开始循环(并且我认为它告诉你它)。你可以使覆盖条件越来越聪明,但它永远不会做你想要的一切,因为那是不可判定的。