gpt4 book ai didi

haskell - 从 Prelude 隐藏实例声明

转载 作者:行者123 更新时间:2023-12-05 01:39:34 29 4
gpt4 key购买 nike

我现在正在玩 Monoids 并想定义我的 <> 实例和 mempty一个列表。我写了这个:

instance Semigroup [a] where
(<>) = (++)

instance Monoid [a] where
mempty = []

但出现错误:

Duplicate instance declarations:
instance Monoid [a] -- Defined at newtype.hs:25:10
instance Monoid [a] -- Defined in ‘GHC.Base’

可能,我需要在文件开头添加:

import Prelude hiding (???)

我应该用什么来代替“???”?

最佳答案

Haskell report说:

Instance declarations cannot be explicitly named on import or export lists. All instances in scope within a module are always exported and any import brings all instances in from the imported module. Thus, an instance declaration is in scope if and only if a chain of import declarations leads to the module containing the instance declaration.

因此不可能排除某个实例。也就是说,这里完全没有必要为列表实现 SemigroupMonoid,因为它已经定义好了。事实上,如果我们检查源代码,我们会看到 Semigroup [src]。 :

-- | @since 4.9.0.0
instance Semigroup [a] where
<b>(<>) = (++)</b>
{-# INLINE (<>) #-}

stimes = stimesList

Monoid [src] :

-- | @since 2.01
instance Monoid [a] where
{-# INLINE mempty #-}
<b>mempty = []</b>
{-# INLINE mconcat #-}
mconcat xss = [x | xs <- xss, x <- xs]

所以这已经完全按照您自己实现的方式实现了。

在您没有自己实现的数据类型上实现您自己没有实现的类型类的实例通常被认为是一种反模式。这称为 orphan instance [haskell-wiki] :

An orphan instance is a type class instance for class C and type T which is neither defined in the module where C is defined nor in the module where T is defined.

通常将一个类型包装到另一个数据构造函数中(使用 newtype)来为类型类定义该类型的不同实例。

关于haskell - 从 Prelude 隐藏实例声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58048733/

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