我正在尝试编写函数,我不知道为什么我不能这样做
ssm' = foldr (\x acc -> if acc == [] then [x]++acc else if (x > (maximum acc)) then [x]++acc else acc) []
请给我一个线索。
答案 0 :(得分: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)
答案 1 :(得分:5)
你已经遇到了monomorphism restriction。您可以通过添加类型签名来修复它。
ssm' :: Ord a => [a] -> [a]
ssm' = ...