Haskell 实现Show类

Haskell 实现Show类,haskell,Haskell,假设我们有以下情况: data Foo x from_list :: [x] -> Foo x to_list :: Foo x -> [x] 数据foox 从_列表::[x]->Foo x to_list::Foo x->[x] 假设我想要声明instance(Show x)=>Show(Foo x),这样显示一个值就可以从\u list生成对的适当调用。我该怎么做呢?特别是,如何实现showsPrec,以满足trixy Fiddy优先规则?(也就是说,当且仅当有必要时,才将表达式放在括号中。

假设我们有以下情况:

data Foo x from_list :: [x] -> Foo x to_list :: Foo x -> [x] 数据foox 从_列表::[x]->Foo x to_list::Foo x->[x]
假设我想要声明
instance(Show x)=>Show(Foo x)
,这样显示一个值就可以从\u list生成对
的适当调用。我该怎么做呢?特别是,如何实现
showsPrec
,以满足trixy Fiddy优先规则?(也就是说,当且仅当有必要时,才将表达式放在括号中。)

这里您想要的基本上与相同,因此我们可以稍微修改一下:

instance Show x => Show (Foo x) where
  showsPrec p xs = showParen (p > 10) $
    showString "from_list " . shows (to_list xs)
换句话说,对于列表,我们使用
Show
实例,在
前面加上“from_list”
,如果周围上下文的优先级高于函数应用程序(其优先级为10),则使用
showParen
在其周围加上括号


没有看到任何已定义的构造函数,在显示
Foo x
时,不清楚要从\u list
处理的
列表。它与Foo字段的关系如何?您不需要使用
showsPrec
来定义它。
Show
的最小完整实例化就是
Show
,并且将根据它定义
showsPrec
。同样的机制只允许为
Eq
定义
(==)
(/=)
中的一个,并免费获得另一个。我要做的是类似
show foo=“foo(fromList”++show(to_list foo)++”
,但是使用
showsPrec
并具有正确的优先级处理。@danr
showsPrec
更有效。@MathematicalOrchid取决于需要添加多少个附件。上面的示例表明,您只是在列表上对
show
的调用中添加常量字符串,并且该实例函数已经很有效了。但正如Dmitry Dzhus所指出的,除非你向我们展示一些构造函数和
Foo
背后的意图,否则没有理由使用
showsPrec
。在第二个例子中:
show(仅来自列表[1,2,3])
是否因为
p
的计算结果是
11
而显示偏执?或者
p
到底是什么?什么是设置
p
> show (from_list [1, 2, 3])
"from_list [1,2,3]"
> show (Just $ from_list [1, 2, 3])
"Just (from_list [1,2,3])"