微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

haskell – 如何在不使用-XUndecidableInstances的情况下绕过功能依赖的覆盖条件

Wen使用函数依赖,我经常达到Coverage条件.可以使用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

当我使结果类型更通用时,Coverage条件失败(因此需要UndecidableInstances):

{-# Language MultiParamTypeClasses,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(可能与类型系列?)的情况下对上述场景进行建模吗?

解决方法

远离UndecidableInstances没有什么大的理由.可能发生的最糟糕的情况是类型检查器开始循环(并且我认为它告诉你它).你可以使覆盖条件越来越聪明,但它永远不会做你想要的一切,因为那是不可判定的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐