在 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 类型类 Show
与 Prelude
.
中的类型类冲突
如果您定义一个实例,那么它指的是哪个 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
).但是,如果两个接口具有相同的名称,那么 不 意味着它们是相同的接口。
我是 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 类型类 Show
与 Prelude
.
如果您定义一个实例,那么它指的是哪个 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
).但是,如果两个接口具有相同的名称,那么 不 意味着它们是相同的接口。