Foldr比较空列表

whd*_*whd 1 haskell fold

我正在尝试编写函数,我不知道为什么我不能这样做

ssm'  = foldr (\x acc -> if acc == [] then [x]++acc else if (x > (maximum acc)) then [x]++acc else acc) [] 
Run Code Online (Sandbox Code Playgroud)

请给我一个线索.

Lan*_*dei 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
Run Code Online (Sandbox Code Playgroud)

如果你真的喜欢单行,试试吧

import Data.List
ssm' xs = reverse $ map head $ groupBy (>) (reverse xs)
Run Code Online (Sandbox Code Playgroud)


ham*_*mar 5

你遇到了单形态限制.您可以通过添加类型签名来修复它.

ssm' :: Ord a => [a] -> [a]
ssm' = ...
Run Code Online (Sandbox Code Playgroud)