在 Haskell 中创建类型类但出现 "ambiguos occurence" 错误

Creating a typeclass in Haskell but getting "ambiguos occurence" error

我是 Haskell 的新手,目前正在尝试弄清楚如何编写自己的类型类。这是我到目前为止得到的:

data Signal = X | O

class Show a where
    show :: a -> String
instance Show Signal where
    show X = "X"
    show O = "O"

当我尝试这个时,我得到了一个错误:

Ambiguous occurrence `Show'
    It could refer to
       either `Prelude.Show',
       or `Main.Show

我不明白为什么会这样,因为我认为 Haskell 中类型类的全部意义在于它使函数重载成为可能?预先感谢您的帮助!

And I can't figure out why that is because I thought the whole point of typeclasses in Haskell was that it made overloading of functions possible?

这是正确的,但是你在这里定义了一个 new 类型类 ShowPrelude.

中的类型类冲突

如果您定义一个实例,那么它指的是哪个 Show 类型类是不明确的。到 Prelude 中定义的那个(很多类型都是其中的成员),或者你在自己的程序中定义的那个。

因此您可以将其定义为:

data Signal = X | O

-- no definition for Show

instance Show Signal where
    show X = "X"
    show O = "O"

如果你想定义自己的类型类,你可以使用:

import Prelude <strong>hiding (Show)

data Signal = X | O

class Show a where</strong>
    show :: a -> String

instance Show Signal where
    show X = "X"
    show O = "O"

但这可能不是一个好主意,因为所有其他类型都不是新类型类的成员,只是 Prelude.

因此,类型类可以被视为 Java 等语言中的接口:如果您的数据类型定义了一个实例,该实例定义了方法的实现(此处 show).但是,如果两个接口具有相同的名称,那么 意味着它们是相同的接口。