2013-01-09 21 views
6

我沒有發現任何關於如何在Haskell去除一個字符串(刪除前導/結尾字符),也沒有地方找到這樣的地方stripchomp函數(糾正我if我錯了)。去除左/右一個字符串(和chomp)

我該怎麼辦?

+0

http://hackage.haskell.org/packages/archive/MissingH/1.0.0/doc/html/Data-String-Utils.html – Shmiddty

回答

8

看看Data.Text。任何使用Prelude列表的東西,例如String,通常表現不佳,尤其是像stripR這樣的功能。有些人認爲這是過去的錯誤,因爲它已經感染了很多(否則是合理的)接口,並且因爲使用單向鏈接的字符列表(String)對文本數據使用效率低下。

你要找的功能,依次爲:dropWhiledropWhileEnddropAroundstripStartstripEndstrip

請注意,基於字符相等沒有特定的剝離功能。除非是非常常用這樣的Data.Char.isSpace,否則你並沒有真正從別名中獲取任何含有假名的別名dropX

1

這裏有3個功能和3 currified別名功能,使其通過:

stripL :: Char -> String -> String 
stripL x = dropWhile (==x) 

stripR :: Char -> String -> String 
stripR x = reverse . stripL . reverse 

strip :: Char -> String -> String 
strip x = stripL x . stripR x 

chompL :: String -> String 
chompL = stripL ' ' 

chompR :: String -> String 
chompR = stripR ' ' 

chomp :: String -> String 
chomp = strip ' ' 

你覺得呢?是否可以將這些功能添加到Data.String

+3

'stripR x = reverse。 stripL。反向' – Shmiddty

+0

好的定義,但是,我會爭辯說,如果你使用的是字符串,你應該嘗試線性處理你的輸入,並且只使用dropWhile isSpace來覆蓋標籤等,因爲在後面剝離的清單效率不高。 (如果你剝離並得到了[],那麼你就處於輸入的結尾)。因此,我只能使用stripL並且更方便地使用dropWhile。這可能是它們被省略的原因。 – AndrewC

5

首先,您應該使用Text(來自text包)而不是String,因爲text效率更高。

此外,text已經有這樣的功能:

-- Remove leading and trailing white space from a string. 
strip :: Text -> Text 
3

的更一般的方法將是一個謂詞傳遞給strip的功能,所以一個可能stripL isSpace例如刪除所有領先的空白。

Then stripL然而只是dropWhile的別名。

對於最終的剝離,一個潛在的更高效的版本使用foldr

stripR :: (a -> Bool) -> [a] -> [a] 
stripR pred = foldr keepOrDrop [] 
    where 
    keepOrDrop c xs 
     | pred c = case xs of 
         [] -> [] 
         _ -> c:xs 
     | otherwise = c:xs 

,可以開始生產輸出而無需遍歷整個輸入列表,並且是有效的,如果有元件的滿足無長期運行謂詞它的輸入。