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
决定的,所以更通用的代码应该不会引起任何问题,所以我的问题是:

  • 在此处使用
    不可判定实例是否存在任何可能的问题
  • 我是否可以在不依赖
    不可判定实例的情况下对上述场景进行建模(可能使用类型族?)

  • 没有什么理由远离
    不可判定的实例
    。最糟糕的情况是,类型检查器开始循环(我想,它会告诉您)。你可以让覆盖条件变得越来越聪明,但它永远不会做你想做的一切,因为那是不可判定的。

    没有什么理由远离
    不可判定的实例。最糟糕的情况是,类型检查器开始循环(我想,它会告诉您)。你可以使覆盖条件变得越来越聪明,但它永远不会做你想做的一切,因为这是不可判定的?