0

我有将字符串连接到参数输入的参数方法:

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

当我不传递字符串时很好,但是当我传递字符串时,我会得到额外的黑斜线。

有什么办法可以避免吗?

4

3 回答 3

4

show不是真正的toString等价物,而是一个inspectvar_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

这样做的一种方法是使用 Typeable 类,虽然不是很好,但它肯定是可能的。

import Data.Maybe (fromMaybe)
import Data.Typeable (cast)
foo :: (Show a, Typeable a) => a -> String
foo f = fromMaybe (show f) (cast f)

但是,这将它限制为 Typeable 类的成员(它包含在基类中,因此您不需要依赖任何更多的库,并且大多数东西都会定义它)。

这通过检查是否f是 a String(或假装是 a String,这只会发生在某人在编写库时真的很邪恶时才会发生),如果是,则返回它,否则显示它。

于 2012-10-13T21:48:31.453 回答