Haskell显示一对字符串

时间:2014-11-04 15:15:58

标签: haskell

如何定义显示(String,String)结构的实例

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

谢谢!

2 个答案:

答案 0 :(得分: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的要求。

答案 1 :(得分: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")