我有将字符串连接到参数输入的参数方法:
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
等价物。它不适用于格式化人工输出。
不了解“标准”库函数,但可以通过自己的类似显示的实现简单地完成:
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)。
这样做的一种方法是使用 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
,这只会发生在某人在编写库时真的很邪恶时才会发生),如果是,则返回它,否则显示它。