簡體   English   中英

Haskell:修剪字符串並消除多個空格

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM