[英]Haskell: trim String and eliminate multiple spaces
我剛剛開始使用Haskell進行編程,想進行String轉換。 我有一個任意字符串,例如“ abcd \\ n dad”,我想刪除左右兩側的空白字符。 而且我想消除多個空格以及轉義序列“ \\ n”->“”
因此上方的字串看起來像是「abcd dad」
我已經編寫了一個修剪字符串並刪除空白字符的函數(如果isSpace為true,則刪除該字符):
trim :: [Char] -> [Char]
trim x = dropWhileEnd isSpace (dropWhile isSpace x)
現在,我的想法是對輸入String進行模式匹配。 但是,如何將修整功能直接應用於輸入呢? 因此,首先,我想在兩端修剪String,然后應用模式匹配。 所以我唯一要做的就是比較兩個字符,如果兩個都是空白字符,則刪除一個
--How do I apply trim directly to the input
s :: [Char] -> [Char]
s [x] = [x]
s(x:xx) = ...
注意:效率並不重要。 我想學習模式匹配的概念,並了解Haskell的工作方式。
干杯
trim = unwords . words
檢查的源words
中拉開序幕。
如果要在trim
的輸出上進行模式匹配,則必須調用trim
! 例如,如果您要使用長度為0、1和更長的列表的個案,則可以使用
s xs = case trim xs of
[] -> ...
[x] -> ...
x:x':xs -> ...
您的第一個模式匹配單個字符並返回它。 當然這不是您想要的-可能是空格。 您的第一個匹配項應為空列表。
如果只刪除空格,則可以執行以下操作:
trim :: [Char] -> [Char]
trim [] = []
trim (' ':xs) = trim xs
...
您應該能夠看到這刪除了所有前導空格。 此時,該字符串為空(並與第一個模式匹配),或者跌落到...由您自己決定。
如果要刪除所有空格,則需要一個或一組這些字符。 可能看起來像這樣:
trim :: [Char] -> [Char]
trim = let whitespace = [' ', '\t\, `\v'] -- There are more than this, of course
in t
where
t [] = []
t (x:xs) | elem x whitespace = t xs
| otherwise = ...
再次說明了如何匹配字符串的開頭部分。 讓您自己去思考到底。
您還可以在嵌套函數中進行模式匹配:
s str = removeInnerSpaces (trim str)
where
removeInnerSpaces [] = []
removeInnerSpaces (x:xs) = ...
在這里removeInnerSpaces
是一個嵌套函數,局部於s
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.