如何定义显示(String,String)结构的实例
instance Show (String, String) where
show (a, b) = show a ++ show b
谢谢!
答案 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")