Haskell 如何绕过函数依赖项的覆盖条件而不使用-XUndecidableInstances
使用函数依赖关系时,我经常碰到覆盖条件。可以使用Haskell 如何绕过函数依赖项的覆盖条件而不使用-XUndecidableInstances,haskell,ghc,functional-dependencies,type-families,Haskell,Ghc,Functional Dependencies,Type Families,使用函数依赖关系时,我经常碰到覆盖条件。可以使用不可判定实例提升它,但我通常会尝试远离该扩展 下面是一个有点做作的示例,它不需要不可判定的实例: {-# Language MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-} data Result = Result String deriving (Eq, Show) data Arguments a b = Arguments a b class A
不可判定实例
提升它,但我通常会尝试远离该扩展
下面是一个有点做作的示例,它不需要不可判定的实例
:
{-# 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
{-# 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
决定的,所以更通用的代码应该不会引起任何问题,所以我的问题是:
不可判定实例是否存在任何可能的问题
不可判定实例的情况下对上述场景进行建模(可能使用类型族?)
没有什么理由远离
不可判定的实例
。最糟糕的情况是,类型检查器开始循环(我想,它会告诉您)。你可以让覆盖条件变得越来越聪明,但它永远不会做你想做的一切,因为那是不可判定的。没有什么理由远离不可判定的实例。最糟糕的情况是,类型检查器开始循环(我想,它会告诉您)。你可以使覆盖条件变得越来越聪明,但它永远不会做你想做的一切,因为这是不可判定的?