在 newtype 上派生 Show 时避免双引号

Jiv*_*van 0 haskell show newtype

我想newtype通过Show以下方式派生来打印 a 的内部值,这样我就不必在Value val每次需要打印时打开它。

{-# LANGUAGE OverloadedStrings          #-}

import Data.Text

newtype Value = Value Text
instance Show Value where show (Value val) = show val


main :: IO ()
main = do
    let hello = Value "hello"
        world = Value "world"
    print $ show hello <> ", " <> show world
    pure ()
Run Code Online (Sandbox Code Playgroud)

这个想法是我可以简单地show hello而不是做let Value helloVal = hello in show helloVal(一个人为的例子,但主要的一点是避免展开)。

问题是这会打印以下内容:

"\"hello\", \"world\""
Run Code Online (Sandbox Code Playgroud)

而期望的结果是:

hello, world
Run Code Online (Sandbox Code Playgroud)

如何获得所需的输出?

Fyo*_*kin 5

的一般约定Show是它应该生成或多或少的 Haskell 代码,在大多数简单的情况下,您只需复制 GHCi 输出并插入到其输入中即可。

这就是为什么show "foo"会产生一个"\"foo\""带引号的字符串。因此,当它在 GHCi 中打印时,您会看到引号。这也是您的类型的默认派生实例生成的原因"Value \"foo\""- 这是直接的 Haskell 代码,可以编译和评估以生成原始Value值。

但是,如果您真的不想要额外的引号 - 当然,只需将您转换TextStringusing unpack

instance Show Value where show (Value v) = unpack v
Run Code Online (Sandbox Code Playgroud)