私がよく知っているほとんどのオブジェクト指向言語では、String
のtoString
メソッドは、実際には唯一の識別関数です。しかし、ハスケルではshow
二重引用符を追加します。クォートを追加しない多相の `toString`関数はありますか?
だから私はこの
f :: Show a => [a] -> String
f = concat . map show
のような関数の何かを書く場合に予想されるとして、それは数字
f [0,1,2,3] -- "0123"
のために動作しますが、とき、本当に私の文字列は、余分な引用符で
f ["one", "two", "three"] -- "\"one\"\"two\"\"three\""
を終わります欲しいものは"onetwothree"
です。
多態的にf
と書いたければ、Show
という制約でそれを行い、文字列のShowインスタンスをオーバーライドしないでください(それが可能であれば)。
class (Show a) => ToString a where
toString = show
、すべてのインスタンスを追加します。
私が思い付くことができる最高のは、私自身の型クラスを作成するのですか?
instance ToString String where toString = id
instance ToString Char where toString = pure
instance ToString Int
instance ToString Maybe
...etc
'newtype'構造を使って、' 'LiteralString'](https://github.com/corsis/PortFusion/blob/ad63a006cff324667cca2316699e26a0078fbc02/src/Main.hs#L67)のタイプを作成しました。 'と' Read'インスタンス:https://github.com/corsis/PortFusion/blob/ad63a006cff324667cca2316699e26a0078fbc02/src/Main.hs#L67 –
も参照してくださいhttp://stackoverflow.com/questions/12102874/haskell-suppress-quotes -around-strings-shown-shown – sth
'Show'は二重引用符を追加するだけでなく、また、改行などの文字をエスケープします。たとえば、1文字の文字列 '' \ n "'は4文字の文字列で表示され、文字 "、\、n"で示されます。 – sdcvvc