Haskell中的字符串连接和不需要的引号

时间:2015-04-12 16:34:55

标签: haskell

我想使用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]的别名?

5 个答案:

答案 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)

函数showsshow一样,将任何类型的数据(类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进行有效的字符串分块。