说我有以下类型:
newtype T1 a = T1 a
我可以为它创建一个Show
实例:
instance showT1Generic :: Show a => Show (T1 a) where
show (T1 a) = "generic: " <> show a
但是,我想说我想为类型T1 Int
做些特别的事情。我试过这样做:
instance showT1Int :: Show (T1 Int) where
show (T1 a) = "int: " <> show a
并且它会编译,但是在psci
中运行并不能按预期工作:
> T1 'a'
generic: 'a'
> T1 1
generic: 1
我这样做错了吗?
答案 0 :(得分:2)
定义这两个实例会引发OverlappingInstances
警告,因为您在这里找到了它 - 它可以使选择的实例变得不可预测。
我认为如果你翻转实例定义的顺序,这将有效,但我们并不建议忽略OverlappingInstances
警告。
你真的可以做你在这里尝试做的事情 - 你可以改变一个带有newtype的实例的行为,但是针对某些具体类型的特殊实例并且具有通用的回退总是会导致重叠的实例。也许如果我们介绍instance chains这将成为可能,但在此之前,你最好不要使用单态函数来做这类事情。