1

関数を書き込もうとしていますが、なぜそのようにできないのかわかりません

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

手がかりをください。

4

2 に答える 2

6

ところで、あなたのコードはあまりにも複雑に見えます。使いすぎif[x]++accただの中古品x:accです。その最大の要素は頭でなければならないaccので、を使用してすべてのステップでスキャンするのは無駄です。全体として、次のように書きます。maximum

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

ワンライナーが本当に好きなら、試してみてください

import Data.List
ssm' xs = reverse $ map head $ groupBy (>) (reverse xs)
于 2012-05-06T19:25:07.377 に答える
5

単相制限に遭遇しました。型署名を追加することで修正できます。

ssm' :: Ord a => [a] -> [a]
ssm' = ...
于 2012-05-06T16:58:16.083 に答える