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)
如何获得所需的输出?
的一般约定Show是它应该生成或多或少的 Haskell 代码,在大多数简单的情况下,您只需复制 GHCi 输出并插入到其输入中即可。
这就是为什么show "foo"会产生一个"\"foo\""带引号的字符串。因此,当它在 GHCi 中打印时,您会看到引号。这也是您的类型的默认派生实例生成的原因"Value \"foo\""- 这是直接的 Haskell 代码,可以编译和评估以生成原始Value值。
但是,如果您真的不想要额外的引号 - 当然,只需将您转换Text为Stringusing unpack:
instance Show Value where show (Value v) = unpack v
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |