2012-02-08 8 views
24

showSトリックを使って文字列を作成する方法がありましたが(たとえば、this discussion)、その説明は見たことがありません。ハスケルのshowSトリックとは何ですか?

showSのトリックとは何ですか?標準ライブラリで

+4

があります

、簡潔な概要は次のようになります。「'showS'トリック」は非効率的な(' O(N^2を有効にすることです) ')左に関連する文字列連結を効率的な(' O(n) ')右連結文字列連結に変換します。 – ntc2

答えて

40

ShowSは次のように定義される:これはdifference listある

type ShowS = String -> String 

。 トリックは、文字列xsShowSとして、他のリストの前に付加された関数(xs ++)によって表されるということです。これにより、効率的な連結が可能になり、ネストされた左結合連鎖(すなわち、((as ++ bs) ++ cs) ++ ds)の問題が回避されます。例えば:大規模な、深くネストされた構造物の効率的なshow INGを許可するように、標準Show型クラスの実装に使われているので、

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、あなたはタイプを持っている、showsPrecを実装することができます

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

これは、演算子の優先順位の取り扱いを可能にし、ShowS値を返します。標準インスタンスは効率のためにshowの代わりにこれを実装します。 show aは、それに関して、showsPrec 0 a ""として定義されます。 (あなただけの完全なインスタンスのためshowsPrecを実装できるように、このデフォルトの定義は、それ自体型クラスShowである。)

+1

リンク: ShowSは基本パッケージのText.Showモジュールにあります。 http://hackage.haskell.org/package/base-4.7.0.2/docs/Text-Show.html –

8

showSは、効率的に示された値の個々の構成要素を連結するための差分リストのアプローチを使用しています。この関数は、表示される値、およびを結果に追加する文字列にします。追加された文字列は、実際に追加される葉に達するまで、一番右のサブ値まで一貫して渡されます。ここでの回答を見ると、ここ(showS含む)、差分リストの説明http://www.haskell.org/haskellwiki/Difference_list

関連する問題