文字列をパラメトリック入力に連結するパラメトリックメソッドがあります。
foo::(Show a) => a -> String
foo f = show f ++ " string"
文字列を渡さなくても問題ありませんが、文字列を渡すと余分な黒スラッシュが表示されます。
これを回避する方法はありますか?
文字列をパラメトリック入力に連結するパラメトリックメソッドがあります。
foo::(Show a) => a -> String
foo f = show f ++ " string"
文字列を渡さなくても問題ありませんが、文字列を渡すと余分な黒スラッシュが表示されます。
これを回避する方法はありますか?
show
は実際にはtoString
同等ではなく、inspect
またはvar_dump
同等です。人間の出力用にフォーマットするためのものではありません。
http://hackage.haskell.org/package/text-formatを検討するかもしれません
「標準」ライブラリ関数については知りませんが、独自のショーのような実装で簡単に実行できます:
class StrShow a where
showStr :: a -> String
instance StrShow String where
showStr = id
instance Show a => StrShow a where
showStr = show
GHCi> showStr 1
"1"
GHCi> showStr "hello"
"hello"
この方法では、追加のライブラリは必要ありませんが、これが問題にならない場合は、多くの ghc の拡張機能 (TypeSynonymInstances、FlexibleInstances、UndecidableInstances、OverlappingInstances) を使用する必要があります。
これを行う 1 つの方法は、あまりいい方法ではありませんが、確かに可能ですが、Typeable クラスを使用することです。
import Data.Maybe (fromMaybe)
import Data.Typeable (cast)
foo :: (Show a, Typeable a) => a -> String
foo f = fromMaybe (show f) (cast f)
ただし、これは Typeable クラスのメンバーに制限されます (これは base に含まれているため、これ以上ライブラリに依存する必要はなく、ほとんどのものはそれを定義しています)。
f
これは、 が であるかどうかをチェックしString
(または のふりをしてString
、誰かがライブラリを作成するときに本当に悪意を持っている場合にのみ発生します)、そうであればそれを返し、そうでなければそれを表示することによって機能します。