2015-04-12 38 views
2

由於效率(可能有很多),我想使用shows連接一串字符串。然而,當我這樣做,我得到不必要的"字符:Haskell中的字符串連接和不需要的引號

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 

是否在其他情況下,一個案件和String[Char]必須做的事情行爲++shows,即使String只是[Char]的別名?

+0

[相關](http://stackoverflow.com/questions/576213/efficient-string-implementation-in-haskell)。 –

+2

'[Char]'與'String'只是類型檢查操作的一個工件;這可能是因爲'(++)'操作一般類型'[a]',而'shows'特定於'String'。 '[Char]'和'String'之間沒有任何區別。 –

回答

6

功能shows,像show,轉換爲一個Haskell表達式表示法的任何類型(Show類)的數據。對於字符串,這涉及在字符串內添加引號和轉義特殊字符。

如果要連接差異字符串,請使用(++)而不是shows。例如。

shows 3 . (++) " , " . shows 4 
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 
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\"" 
0

從實際的角度來看,如果你真的擔心你的效率可能要使用火焰建設者。該代碼會是這樣的:

unpack $ toLazyByteString (fromString "a" <> fromString "b" <> fromString "c") 
-1

使用Data.Text.append對字符串進行高效的組塊。

相關問題