2017-02-09 62 views
0

我試圖來解決HackerRank一個簡單的問題,並在標題我收到錯誤。我是一個Haskell noob,與我一起裸露。該問題要求採取一個字符串,並通過刪除相鄰的字母來減少字符串。例如「aabcdd」=>「bc」。這裏是我的代碼:Haskell字符串操作。功能錯誤中的非窮舉模式。

main :: IO() 
main = do 
    line <- getLine 
    putStrLn (reduce' line) 

reduce' :: String -> String 
reduce' [] = [] 
reduce' (x0:x1:xs) 
    | x1:xs == [] = [x0] 
    | x0 == x1 = reduce' xs 
    | otherwise = x0 : x1 : reduce' xs 

我很困惑,因爲我想我已經覆蓋的邊緣情況。我不想要問題的答案,我只想知道爲什麼我會收到錯誤。謝謝!

+0

它已經一段時間,因爲我寫的哈斯克爾,但IIRC,你最後的情況下,將只匹配正好3個字符。如果字符串有1或2個元素,它將不匹配。 – Carcigenicate

+0

@Carcigenicate:沒有兩個元素'xs'是列表的尾部。 –

+0

@WillemVanOnsem哦對。所以只有1個元素。 – Carcigenicate

回答

4

你不配套,你在列表中

reduce' :: String -> String 
reduce' [] = [] 
reduce' [x] = [x] 
reduce' (x0:x1:xs) 
    | x0 == x1 = reduce' xs 
    | otherwise = x0 : x1 : reduce' xs 

| x1:xs == [] = [x0]只有一個元素爲匹配添加的模式,所以沒有必要在警衛檢查。

+0

就是這樣!謝謝。 – Outis

+1

請注意,前兩種情況一起可以寫成一個'reduce'x = x',如果你把*放在* x0:x1:xs'的情況之後。 – chepner