2015-10-29 36 views
3

這是用於Haskell中的任務。 我們一直負責使用foldr函數定義各種函數。Haskell - 具有foldr功能的組列表元素

我們都被賦予了類型:

group :: Eq a => [a] -> [[a]] 

和被要求來定義它使得:

group [1,2,2,3,4,4,4,5] = [[1], [2,2], [3], [4,4,4], [5]] 
group [1,2,2,3,4,4,4,5,1,1,1] = [[1], [2,2], [3], [4,4,4], [5], [1,1,1]] 

這是我到目前爲止有:

group = foldr (\x xs -> if x == head (head xs) then (x : head xs) : xs else (x : []) : (head xs) : xs) 

但當我嘗試加載到ghci解釋器時,我收到以下錯誤消息:

Couldn't match type `[a0] -> [a]' with `[[a]]' 
Expected type: [a] -> [[a]] 
    Actual type: [a] -> [a0] -> [a] 
In the return type of a call of `foldr' 
Probable cause: `foldr' is applied to too few arguments 
In the expression: 
    foldr 
    (\ x xs 
     -> if x == head (head xs) then 
       (x : head xs) : xs 
      else 
       (x : []) : (head xs) : xs) 
In an equation for `group': 
    group 
     = foldr 
      (\ x xs 
      -> if x == head (head xs) then 
        (x : head xs) : xs 
       else 
        (x : []) : (head xs) : xs) 

如果任何人都可以解釋爲什麼我的代碼不能像我期望的那樣工作,那將不勝感激。 謝謝。

+0

它說你就在那裏:你需要一個額外的參數...嘗試任何你想得到的,如果你做'組[]';)(但要小心會有其他問題...) – Carsten

回答

2

我認爲你是在正確的軌道上,所以我會盡量把你的想法寫得更好。我想說的是這樣的:你應該拉出來foldr第一個參數成函數,並再次做模式匹配:

group :: Eq a => [a] -> [[a]] 
group = foldr f undefined 
    where f x []  = undefined 
     f x ([email protected](y:_):yss) 
      | x == y = undefined 
      | otherwise = undefined 

本應該做的 - 現在你必須把正確的東西這裏我把undefined :)

我會回來後,並完成它


嗯,我想你放棄了什麼 - 反正這裏是一個解決方案:

group :: Eq a => [a] -> [[a]] 
group = foldr f [] 
    where f x []  = [[x]] 
     f x ([email protected](y:_):yss) 
      | x == y  = (x:ys):yss 
      | otherwise = [x]:ys:yss 

和幾個例子:

λ> group [] 
[] 
λ> group [1] 
[[1]] 
λ> group [1,1] 
[[1,1]] 
λ> group [1,2,1] 
[[1],[2],[1]] 
λ> group [1,2,2,3,4,4,4,5] 
[[1],[2,2],[3],[4,4,4],[5]] 

注意f小號模式並不詳盡(這是沒有問題的 - 想想爲什麼) - 當然你也可以的程度,如果你想(如果你不同意group [] = []比你必須。

+0

這太嚴格了, 我的想法是。 – dfeuer

+0

@dfeuer很可能是 - 但IMO這是我認爲在詹姆斯嘗試帶來*生活*;我看到的想法) - 我不假裝給*最好*答案^^ – Carsten

+0

感謝您的迴應,您的答案是有道理的,實際上它幾乎與zuko32發佈的網站上的答案模型答案几乎相同: pack ::(方程a)=> [a] - > [[a]] pack = foldr func [] 其中func x [ ] = [[x]] func x(y:xs)= if x ==(head y)then((x:y):xs)else([x]:y:xs) – James

1

只是提一提,如果我沒看錯,這就是問題9從可以在這裏找到了99個哈斯克爾問題:https://wiki.haskell.org/99_questions/
對於每一個問題,它還包含了許多解決方案(通常情況下),並自卡斯滕介紹一個很好的解決方案,你可以去那裏看看其他的解決方案,這樣你就可以通過各種方式獲得不同的想法。

+0

你是對的,它是同樣的問題,感謝指導我。 – James

+0

@詹姆斯沒有人。我認爲這對於Haskell程序員來說是一個非常好的做法,所以你很有興趣去嘗試更多的這些問題。 :) – zuko32