gpt4 book ai didi

haskell - 我可以告诉 GHC 任意选择使用哪个实例,因为我不在乎吗?

转载 作者:行者123 更新时间:2023-12-01 03:36:18 25 4
gpt4 key购买 nike

我有一些这样的代码:

{-# OPTIONS_GHC -Wall #-}
{-# LANUAGE VariousLanguageExtensionsNoneOfWhichWorked #-}

import Control.Applicative
import Data.Either
import Data.Void

class Constructive a where
lem :: Either (a -> Void) a

instance Constructive Void where
lem = Left id

instance Num a => Constructive a where
lem = Right 0

instance Enum a => Constructive a where
lem = Right $ toEnum 0

instance Bounded a => Constructive a where
lem = Right minBound

instance Monoid a => Constructive a where
lem = Right mempty

instance Alternative f => Constructive (f a) where
lem = Right empty

问题是,GHC 提示
pad.hs:49:10:
Duplicate instance declarations:
instance [overlap ok] Bounded a => Constructive a
-- Defined at pad.hs:49:10
instance [overlap ok] Monoid a => Constructive a
-- Defined at pad.hs:52:10

伴随着一堆类似的错误。

有没有办法告诉 GHC 随机选择一个,因为我不在乎它使用哪个? (我什至不在乎每次我使用 lem 时它是否选择不同的,因为这无关紧要。)

最佳答案

这并不是对您问题的真正答案,更像是一条扩展评论,提出了如何解决问题的另一种途径。

在 Haskell 中,规范的解决方案是创建一个 newtype对于您的每个实例,这可能不是您想要的。但是,我想建议您另一种方法。

在 Haskell 中,我们基本上有 3 种可能性来构造数据类型:

  • 使用产品和 coproducts 的代数数据类型(不相交的工会)。
  • 函数类型。
  • 原始类型。

  • 对于第一部分,我们可以使用 SYBGHC Generics .如果产品为空,或有空因子,则映射到 a -> Void .一个联积映射到 a -> Void如果它的所有被加数都可以。

    A函数类型 a -> b如果两者 a 都是 build 性的和 b是:
    instance (Constructive a, Constructive b) => Constructive (a -> b) where
    ...

    x :: b非空, a -> bconst x 居住.如 a为空然后 a -> babsurd 居住.如果 a非空且 b为空, a -> b映射到 Void .

    所有的 Haskell 原始类型都是非空的,所以它们是微不足道的。

    不幸的是,似乎没有办法告诉 GHC 所有数据类型都是这三种类型之一。我的建议是为 -> 实现实例。然后要么
  • 尝试使用 SYB 为所有实现 Data 的东西实现一个实例.如何处理重叠实例仍然存在问题。或:
  • 尝试使用 GHC 泛型为 ADT 提供默认实例,并为原始类型手动实现实例。这意味着对于每种数据类型,您仍然必须提供一个空的 instance实现,默认由泛型提供。

  • 写完这篇,才发现 AdvancedOverlap .也许将它与以前的方法之一结合起来可能会产生一个很好的解决方案。

    关于haskell - 我可以告诉 GHC 任意选择使用哪个实例,因为我不在乎吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34458851/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com