2012-02-08 36 views
24

我已經看到引用showS構建字符串的技巧(例如,在this discussion中),但我從來沒有看到它的很好的描述。Haskell中的showS詭計是什麼?

什麼是showS技巧?

+4

望着這裏的答案,簡明摘要可能是一個描述:「'showS'絕招」就是把一個低效('爲O(n^2 )'把左邊關聯的字符串連接成一個有效的('O(n)')右邊關聯的字符串連接,方法是將字符串轉換爲(前置)連續,然後組成連續。 – ntc2 2013-12-27 01:11:06

回答

40

在標準庫,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 "" 

,因爲它在標準Show類型類的實現中使用,以實現有效show ING大,深度嵌套的結構這就是所謂的ShowS;以及show,可以實現showsPrec,它的類型是:

showsPrec :: (Show a) => Int -> a -> ShowS 

這使得運算符優先級的處理,並返回一個值ShowS。標準實例實現此效率而不是show; show a然後被定義爲showsPrec 0 a ""。 (此默認定義是在Show類型類本身,所以你可以實現showsPrec一個完整的實例。)

+1

鏈接: ShowS位於基本包的Text.Show模塊中,位於 http://hackage.haskell.org/package/base-4.7.0.2/docs/Text-Show.html – 2015-02-02 15:06:41

8

showS採用差分列表的方法來有效地串聯的顯示值的各個組件。該函數取值顯示,一個字符串追加到結果。附加的字符串一直傳遞到最右邊的子值,直到它到達一個葉子,它實際上被附加到葉子上。

有差異列表(包括showS)這裏http://www.haskell.org/haskellwiki/Difference_list