实现Show类

时间:2012-01-31 15:58:22

标签: haskell

假设我们有以下内容:

data Foo x
from_list :: [x] -> Foo x
to_list :: Foo x -> [x]

假设我想声明instance (Show x) => Show (Foo x),以便显示一个值会产生对from_list的适当调用。 完全我是如何做到的?特别是,如何实现showsPrec以满足三元组的优先级规则? (也就是说,当且仅在必要时将表达式放在括号中。)

1 个答案:

答案 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])"