我想使用shows
连接一堆字符串,因为效率(可能有很多字符串)。但是,当我这样做时,我会收到不需要的"
字符:
Prelude> "a" ++ "b" ++ "c"
"abc" -- ordinary concatenation - expected result
Prelude> (shows "a" . shows "b" . shows "c") ""
"\"a\"\"b\"\"c\"" -- actual result
有人可以解释为什么会发生这种情况,我该怎么做才能使用++
函数来实现shows
行为?
当我看到上面那些类型时(出于好奇心),我得到了以下内容:
Prelude> :t ("a" ++ "b" ++ "c")
("a" ++ "b" ++ "c") :: [Char]
Prelude> :t ((shows "a" . shows "b" . shows "c") "")
((shows "a" . shows "b" . shows "c") "") :: String
一个案例中的[Char]
和另一个案例中的String
是否必须对++
和shows
的行为采取任何行动,即使String
只是[Char]
的别名?
答案 0 :(得分:9)
请注意,show "a"
为"\"a\""
。 show
的要点是打印一些可以被Haskell解释为Read
的文字值的东西。所以“显示”字符串意味着包括引号字符。相反,您可以使用showChar
建立一个这样的列表:
> (showChar 'a' . showChar 'b' . showChar 'c') ""
"abc"
> length it -- `it` refers to the result of the last computation in GHCi
3
答案 1 :(得分:7)
"a"
是show "a"
,("a" ++)
是shows "a"
。所以:
> "a" ++ "b" ++ "c"
"abc"
> show "a" ++ show "b" ++ show "c"
"\"a\"\"b\"\"c\""
> (("a" ++) . ("b" ++) . ("c" ++)) ""
"abc"
> (shows "a" . shows "b" . shows "c") ""
"\"a\"\"b\"\"c\""
答案 2 :(得分:6)
函数shows
与show
一样,将任何类型的数据(类Show
)转换为Haskell表达式表示法。对于字符串,这涉及在字符串中添加引号和转义特殊字符。
如果要连接差异字符串,请将(++)
用于字符串而不是shows
。 E.g。
shows 3 . (++) " , " . shows 4
答案 3 :(得分:0)
从实际角度来看,如果你真的担心效率,你可能想要使用blaze-builder。代码类似于:
unpack $ toLazyByteString (fromString "a" <> fromString "b" <> fromString "c")
答案 4 :(得分:-1)
使用Data.Text.append
进行有效的字符串分块。