Haskell中的showS技巧是什么?

时间:2012-02-08 16:58:10

标签: haskell

我已经看到了showS技巧的引用来构建字符串(例如,在this discussion中),但我从来没有看到它的良好描述。

什么是showS技巧?

2 个答案:

答案 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使用差异列表方法有效地连接显示值的各个组件。该函数将显示值,一个字符串,以附加到结果中。附加的字符串一直向下传递到最右边的子值,直到它到达叶子,实际上附加了叶子。

这里有差异列表(包括showShttp://www.haskell.org/haskellwiki/Difference_list

的说明