0

文字列をパラメトリック入力に連結するパラメトリックメソッドがあります。

foo::(Show a) => a -> String
foo f = show f ++ " string"

文字列を渡さなくても問題ありませんが、文字列を渡すと余分な黒スラッシュが表示されます。

これを回避する方法はありますか?

4

3 に答える 3

4

showは実際にはtoString同等ではなく、inspectまたはvar_dump同等です。人間の出力用にフォーマットするためのものではありません。

http://hackage.haskell.org/package/text-formatを検討するかもしれません

于 2012-10-13T17:09:37.377 に答える
1

「標準」ライブラリ関数については知りませんが、独自のショーのような実装で簡単に実行できます:

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) を使用する必要があります。

于 2012-10-13T22:10:11.820 に答える
0

これを行う 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、誰かがライブラリを作成するときに本当に悪意を持っている場合にのみ発生します)、そうであればそれを返し、そうでなければそれを表示することによって機能します。

于 2012-10-13T21:48:31.453 に答える