2014-11-04 59 views

回答

2

如果你使用正确的缩进,并在完全无害-XFlexibleInstances

{-# LANGUAGE FlexibleInstances #-} 
instance Show (String, String) where 
    show (a, b) = show a ++ show b 

那么这种情况下切换会,本身的工作(需要打开-XFlexibleInstances)。然而,它不会编译,因为一个严格的更一般的实例

instance (Show a, Show b) => Show (a, b) where 
    show (a, b) = "(" ++ show a ++ "," ++ show b ++ ")" 

已经定义在前奏。如果您决定重写那个,那么您还需要打开-XOverlappingInstances。但是这个并没有那么无害。实际上it's evil:重叠的实例会导致各种麻烦,并且针对您的具体定义该实例也不符合read . show ≡ id的要求。

+0

我问它构建为了在自定义类型中使用相同的语法,它工作,谢谢! – yonutix 2014-11-04 15:23:41

2

简短的回答是,你不能没有一堆语言扩展,真的更适合其他任务。

(Show a, Show b) => Show (a, b)已经有一个实例,这意味着将其定义为(String, String)将与已有实例重叠。更好的选择是写自己的showStrTuple

showStrTuple :: (String, String) -> String 
showStrTuple (a, b) = show a ++ show b 

另外,如果你真的想用就可以show,使NEWTYPE(这是专为定义新类型类是将与现有否则冲突):

newtype StrTuple = StrTuple { unStrTuple :: (String, String) } deriving (Eq) 

instance Show StrTuple where 
    show (StrTuple (a, b)) = show a ++ show b 

然后你只用

show $ StrTuple ("hello", "world") 
+0

然而,你是对的,我要求这个使用另一种类型的知识而不用在这里放置很多代码 – yonutix 2014-11-04 15:25:15