显示字符串时删除反斜杠?

时间:2012-10-13 16:55:24

标签: haskell

我有参数化方法,它将String连接到参数输入:

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

当我传入一个字符串时它很好,但是当我传入一个字符串时,我会得到额外的黑色斜杠。

有没有办法让我避开?

3 个答案:

答案 0 :(得分:4)

show实际上不是toString等效,而是inspectvar_dump等效。它不适用于人类输出的格式化。

您可以考虑http://hackage.haskell.org/package/text-format

答案 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中,因此您不需要依赖任何更多的库,并且大多数事情都会定义它)。

这可以通过检查fString(或假装是String来实现,只有当某人在编写图书馆时真的是邪恶的时候才会发生这种情况),如果它是,返回它,否则显示它。