Haskell 显示字符串时删除反斜杠?
我有一种参数化方法,它将字符串连接到参数化输入上:Haskell 显示字符串时删除反斜杠?,haskell,Haskell,我有一种参数化方法,它将字符串连接到参数化输入上: foo::(Show a) => a -> String foo f = show f ++ " string" 当我不传入字符串时是可以的,但是当我传入字符串时,我会得到额外的黑色斜线 有什么方法可以避免这种情况吗?show并不是真正的toString等价物,而是inspect或var\u dump等价物。它不是用来格式化人工输出的 >您可以考虑 显示不是真正的 toStase等价物,而是一个检查 >或 VARYDUPP等效。
foo::(Show a) => a -> String
foo f = show f ++ " string"
当我不传入字符串时是可以的,但是当我传入字符串时,我会得到额外的黑色斜线
有什么方法可以避免这种情况吗?
show
并不是真正的toString
等价物,而是inspect
或var\u dump
等价物。它不是用来格式化人工输出的
>您可以考虑
<代码>显示不是真正的<代码> toStase等价物,而是一个<代码>检查<代码> >或<代码> VARYDUPP等效。它不是用来格式化人工输出的你可以考虑< /p> 这样做的一个方法,这不是很好,但它确实是可能的,就是使用可键入的类。
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
是否是字符串(或者假装是字符串,这只会发生在编写库时有人真的很邪恶的情况下),如果是,则返回它,否则显示它。这样做的一种方法,虽然不是很好,但肯定是可能的,是使用可键入类
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
是否是字符串(或者假装是字符串,这只会发生在编写库时有人真的很邪恶的情况下),如果是,则返回它,否则显示它。不知道“标准”库函数,但只需使用自己的类似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、UndededicatableInstances、OverlappingInstances)。不了解“标准”库函数,但只需使用自己的类似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、UndededicatableInstances、OverlappingInstances)如果这不是一个问题。我真的不想使用很多库我真的不想使用很多库如果你删除实例Show a=>StrShow a where showStr=Show
并手动添加每个实例,你只需要类型同义词实例
就可以了。你只需要TypeSynonymInstances
如果删除instance Show a=>StrShow a where showStr=Show
并手动添加每个实例。