2016-09-30 44 views
2

我有一個看似簡單的Haskell問題,並且我的知識有限,我不確定爲了解決它而搜索的條件。haskell初始累加器'空'值

我試圖從99個Haskell的問題(從清單中移除連續的重複)解決問題的編號爲8,這是我想出來的:

compress :: (Eq a) => [a] -> [a] 
compress list = compress' list ??? 
    where 
    compress' [] _ = [] 
    compress' (x:xs) last 
     | x == last = compress xs last 
     | otherwise = x : compress xs x 

「???」只是一個佔位符,這是我不確定該怎麼做的地方。我想這個代碼片段的工作原理應該足夠清楚,'last'是一個累加器,用於檢查元素是否與以前的元素重複。 現在,在這種情況下,我可以給出'最後'的初始值? (我想大多數OO語言中類似'null'的東西)。

編輯:Tikhon的答案有效,但是我只是意識到我在我原來的帖子中犯了一個錯誤,compress'應該遞歸調用它自己而不是壓縮。因此,我的問題的'微不足道'的解決方案是:

compress :: (Eq a) => [a] -> [a] 
compress list = compress' list Nothing 
    where 
    compress' [] _ = [] 
    compress' (x:xs) Nothing = x : compress' xs (Just x) 
    compress' (x:xs) (Just last) 
     | x == last = compress' xs (Just last) 
     | otherwise = x : compress' xs (Just x) 
+1

'???只是一個佔位符。如果你用'_'改變'???'並重新加載,GHCi會嘗試猜測在「打孔」中應該是什麼類型。 – danidiaz

+4

'compress [] = []; compress(x:xs)= x:compress'xs x' – melpomene

回答

9

所以有兩個答案你的問題。以文字答案是,你可以使用Maybe,使一些空的,並且類型系統將確保你檢查的東西是否是Nothing每次使用它的時候:

compress list = compress' list Nothing 
    where compress' [] _ = [] 
     compress' (x:xs) Nothing = x : compress xs (Just x) 
     compress' (x:xs) (Just last) 
      | x == last = compress xs last 
      | otherwise = x : compress xs (Just x) 

這個故事的寓意是,如果你有一個可能會丟失的元素(即可能是其他語言中的null),請將其包裝在Maybe中。然後你要麼有Just x要麼有Nothing,你可以按照模式匹配的方式在列表上匹配模式。

但是,在這種特殊情況下,我們可以有一個更清潔的解決方案。請注意,該元素僅在第一次缺失時致電compress'。我們可以通過增加的情況下,以頂級compress功能,處理這種可能性對付這樣的:

compress [] = [] 
compress (x:xs) = x : compress' xs x 
    where ... 

從本質上講,我們能夠避免需要來處理我們的幫手compress'功能的情況下,如果我們不是在處理它頂層函數,我們可以在傳入的列表中匹配以決定要做什麼。

+0

我已經將'x'作爲參數添加到'compress'',因爲我認爲這可能是您的意圖;如果沒有,我的道歉。 –

+0

@DanielWagner:謝謝!這幾乎肯定是正確的 - 我(仍然)懶得測試我的代碼:)。 –