showS
トリックを使って文字列を作成する方法がありましたが(たとえば、this discussion)、その説明は見たことがありません。ハスケルのshowSトリックとは何ですか?
showSのトリックとは何ですか?標準ライブラリで
showS
トリックを使って文字列を作成する方法がありましたが(たとえば、this discussion)、その説明は見たことがありません。ハスケルのshowSトリックとは何ですか?
showSのトリックとは何ですか?標準ライブラリで
、ShowS
は次のように定義される:これはdifference listある
type ShowS = String -> String
。 トリックは、文字列xs
がShowS
として、他のリストの前に付加された関数(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
である。)
リンク: ShowSは基本パッケージのText.Showモジュールにあります。 http://hackage.haskell.org/package/base-4.7.0.2/docs/Text-Show.html –
showS
は、効率的に示された値の個々の構成要素を連結するための差分リストのアプローチを使用しています。この関数は、表示される値、およびを結果に追加する文字列にします。追加された文字列は、実際に追加される葉に達するまで、一番右のサブ値まで一貫して渡されます。ここでの回答を見ると、ここ(showS
含む)、差分リストの説明http://www.haskell.org/haskellwiki/Difference_list
があります
、簡潔な概要は次のようになります。「'showS'トリック」は非効率的な(' O(N^2を有効にすることです) ')左に関連する文字列連結を効率的な(' O(n) ')右連結文字列連結に変換します。 – ntc2