2013-10-31 86 views
1

我剛剛開始使用Haskell進行編程,並希望進行字符串轉換。 我有一個任意的字符串,例如 「abcd \ n爸爸」 我想刪除左側和右側的空白字符。我想消除多個空格以及逃生sequcences「\ n」 - >「」Haskell:修剪字符串並消除多個空格

所以上面的字符串應該是這樣 「ABCD爸爸」

我已經寫了修剪功能String和刪除空白字符(我刪除的字符,如果isspace爲是真實的):

trim :: [Char] -> [Char] 
trim x = dropWhileEnd isSpace (dropWhile isSpace x) 

現在我的想法是做對輸入字符串匹配的模式。但是,如何將修剪功能直接應用於輸入?所以起初我想修剪兩端的字符串,然後應用模式匹配。所以,我必須做的唯一事情就是比較兩個字符和刪除一個,如果都是空白字符

--How do I apply trim directly to the input 
    s :: [Char] -> [Char] 
    s [x] = [x] 
    s(x:xx) = ... 

注:效率並不重要。我想了解模式匹配的概念並理解Haskell是如何工作的。

乾杯

回答

2

如果你想上的trim輸出模式匹配,你必須調用trim,當然!例如,如果你想爲長度爲0,1名單的情況下,和更長的,你可以使用

s xs = case trim xs of 
    [] -> ... 
    [x] -> ... 
    x:x':xs -> ... 
2

你的第一個模式匹配單個字符並返回它。當然,這不是你想要的 - 它可能是空格。你的第一場比賽應該是空的名單。

如果你只是刪除空間字符,你可以做這樣的事情:

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 = ... 

此外,這已經顯示瞭如何匹配字符串的開始部分。留下來讓你思考如何走到最後。

0

你也可以做一個嵌套函數模式匹配:

s str = removeInnerSpaces (trim str) 
    where 
    removeInnerSpaces [] = [] 
    removeInnerSpaces (x:xs) = ... 

這裏removeInnerSpaces是一個嵌套函數,本地s

7

trim = unwords . words

檢查的words在序曲的來源。

+4

OP正試圖學習如何在Haskell中編寫模式匹配/遞歸函數,而不是如何使用已經存在的函數。 – itsbruce

+0

我意識到並堅持這種方法,即理解如何簡單地(適當地)做這件事,然後分析源代碼中的底層細節,事實上,這種情況在這種情況下是相關的。 – user2939875

+0

幫我一把,正在尋找答案。謝謝。 – cevaris