的我如何定义一个实例显示(字符串,字符串)结构哈斯克尔显示对字符串
instance Show (String, String) where
show (a, b) = show a ++ show b
谢谢!
的我如何定义一个实例显示(字符串,字符串)结构哈斯克尔显示对字符串
instance Show (String, String) where
show (a, b) = show a ++ show b
谢谢!
如果你使用正确的缩进,并在完全无害-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
的要求。
简短的回答是,你不能没有一堆语言扩展,真的更适合其他任务。
(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")
然而,你是对的,我要求这个使用另一种类型的知识而不用在这里放置很多代码 – yonutix 2014-11-04 15:25:15
我问它构建为了在自定义类型中使用相同的语法,它工作,谢谢! – yonutix 2014-11-04 15:23:41