假设我们有以下内容:
data Foo x from_list :: [x] -> Foo x to_list :: Foo x -> [x]
假设我想声明instance (Show x) => Show (Foo x)
,以便显示一个值会产生对from_list
的适当调用。 完全我是如何做到的?特别是,如何实现showsPrec
以满足三元组的优先级规则? (也就是说,当且仅在必要时将表达式放在括号中。)
答案 0 :(得分:18)
这里你想要的基本上与what Data.Set
does相同,所以我们可以稍微修改一下:
instance Show x => Show (Foo x) where
showsPrec p xs = showParen (p > 10) $
showString "from_list " . shows (to_list xs)
换句话说,我们使用Show
实例作为列表,将"from_list "
添加到其中,如果周围上下文的优先级高于函数应用程序,则使用showParen
在其周围添加括号(优先级为10)。
> show (from_list [1, 2, 3])
"from_list [1,2,3]"
> show (Just $ from_list [1, 2, 3])
"Just (from_list [1,2,3])"