Haskell中的showS技巧是什么?

lui*_*dro 26 haskell

我已经看到了showS对构建字符串的技巧的引用(例如,在本讨论中),但我从未见过它的良好描述.

什么是showS技巧?

ehi*_*ird 42

在标准库中,ShowS定义为:

type ShowS = String -> String
Run Code Online (Sandbox Code Playgroud)

这是一个差异列表.诀窍在于,字符串由将其添加到任何其他列表的函数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 ""
Run Code Online (Sandbox Code Playgroud)

ShowS之所以这样,是因为它用于标准Show类型类的实现,以便有效地show处理大型,深层嵌套的结构; 以及show,你可以实现showsPrec,其类型:

showsPrec :: (Show a) => Int -> a -> ShowS
Run Code Online (Sandbox Code Playgroud)

这允许处理运算符优先级,并返回一个ShowS值.标准实例实现了这个而不是show效率; show a然后用它来定义,如showsPrec 0 a "".(此默认定义位于Show类型类本身中,因此您只需实现showsPrec完整的实例.)


pat*_*pat 9

showS使用差异列表方法有效地连接所显示值的各个组件.该函数接受显示的值,附加一个字符串以附加到结果中.附加的字符串一直向下传递到最右边的子值,直到它到达叶子,实际上附加了叶子.

这里有一个差异列表(包括showS)的描述http://www.haskell.org/haskellwiki/Difference_list