我有参数化方法,它将String连接到参数输入:
foo::(Show a) => a -> String
foo f = show f ++ " string"
当我传入一个字符串时它很好,但是当我传入一个字符串时,我会得到额外的黑色斜杠。
有没有办法让我避开?
答案 0 :(得分:4)
show
实际上不是toString
等效,而是inspect
或var_dump
等效。它不适用于人类输出的格式化。
答案 1 :(得分:1)
不了解“标准”库函数,但可以使用自己的类似show的实现来完成:
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)。
答案 2 :(得分: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类的成员(包含在base中,因此您不需要依赖任何更多的库,并且大多数事情都会定义它)。
这可以通过检查f
是String
(或假装是String
来实现,只有当某人在编写图书馆时真的是邪恶的时候才会发生这种情况),如果它是,返回它,否则显示它。