我已经看到了showS
技巧的引用来构建字符串(例如,在this discussion中),但我从来没有看到它的良好描述。
什么是showS技巧?
答案 0 :(得分:42)
在标准库中,ShowS
定义为:
type ShowS = String -> String
这是difference list。
诀窍是,字符串xs
由函数表示为ShowS
,该函数将其添加到任何其他列表:(xs ++)
。这允许有效的连接,避免嵌套的左关联连接(即((as ++ bs) ++ cs) ++ ds
)的问题。例如:
hello = ("hello" ++)
world = ("world" ++)
-- We can "concatenate" ShowS values simply by composing them:
helloworld = hello . world
-- and turn them into Strings by passing them an empty list:
helloworld' = helloworld ""
它被称为ShowS
,因为它用于标准Show
类型类的实现,以允许有效show
大型深层嵌套结构;和show
一样,您可以实现showsPrec
,其类型为:
showsPrec :: (Show a) => Int -> a -> ShowS
这允许处理运算符优先级,并返回ShowS
值。标准实例实现此而不是show
以提高效率;然后根据show a
定义showsPrec 0 a ""
。 (此默认定义位于Show
类型类本身,因此您只需为完整实例实现showsPrec
。)
答案 1 :(得分:9)
showS
使用差异列表方法有效地连接显示值的各个组件。该函数将显示值,和一个字符串,以附加到结果中。附加的字符串一直向下传递到最右边的子值,直到它到达叶子,实际上附加了叶子。
这里有差异列表(包括showS
)http://www.haskell.org/haskellwiki/Difference_list