【发布时间】:2013-05-08 09:46:57
【问题描述】:
我正在使用以下类型类:
module T where
class T a where
v :: a
我实现的T Int 的一个实例:
import T
import A (av)
instance T Int where
v = 0
main = putStrLn (av ++ show v)
还有一个我想从中使用值的模块,它也有一个 T Int 的实例。
module A where
import T
instance T Int where
v = 0
av = "value from A"
问题是这不起作用:
$ runghc Main.hs
Main.hs:4:9:
Duplicate instance declarations:
instance T Int -- Defined at Main.hs:4:9-13
instance T Int -- Defined at A.hs:3:9-13
Haskell 抱怨同一个实例有 2 个声明。如何告诉他不要从B导入实例,或者统一两个实例,或者只使用Main的实例?
【问题讨论】:
-
不要这样做。正确的解决方案是只在一个地方声明实例。
-
@hammar:我没有写
T或B,但我想使用来自B的值,我想创建一个T的实例。跨度> -
啊,这让事情变得更棘手了。在这种情况下,您可以创建一个
newtype包装现有类型,并为newtype编写您的实例。
标签: haskell namespaces typeclass name-conflict