2012-05-06 48 views
1

我試着寫功能,我不知道爲什麼我不能讓它以這種方式FOLDR比較累加器空單

ssm' = foldr (\x acc -> if acc == [] then [x]++acc else if (x > (maximum acc)) then [x]++acc else acc) [] 

給我一個線索請。

+0

它並不能編譯我的ghci的......我試圖重寫功能ssm xs = foldr((:)。head)[](groupBy(> =)xs)不使用groupby – whd

+0

如果您正在使用'ghci',您是否記得使用'let'語法? 'let ssm'= ....' –

+0

我正在從文件加載 – whd

回答

6

順便說一句,你的代碼看起來太複雜了。你過度使用if[x]++acc只是x:acc。掃描acc在每一步使用maximum是浪費,因爲它的最大元素必須是它的頭。產品總數我會寫:

ssm' :: Ord a => [a] -> [a] 
ssm' = foldr go [] where 
    go x [] = [x] 
    go x [email protected](m:_) 
    | x > m = x:ms 
    | otherwise = ms 

如果你真的單行,儘量

import Data.List 
ssm' xs = reverse $ map head $ groupBy (>) (reverse xs) 
+0

我的直線更容易我發佈它在coment下第一篇文章沒有反過來謝謝你的解決方案 – whd