我正在尝试删除列表中的最大值和最小值。
filter (/= minimum [1,2,3,4] && /= maximum [1,2,3,4] ) [1,2,3,4]
不幸的是,每当我尝试这样做时,我在输入“\ =”时得到一个解析错误 有谁知道这个错误背后的原因是什么以及如何解决它?
答案 0 :(得分:4)
修复
filter (\x -> x /= minimum [1,2,3,4] && x /= maximum [1,2,3,4]) [1,2,3,4]
作为一个功能
removeMinMax xs = filter (\x -> x /= minimum xs && x /= maximum xs) xs
pointfree(过滤器)
removeMinMax xs = filter (not.flip elem [minimum xs, maximum xs]) xs
答案 1 :(得分:2)
&& :: Bool -> Bool -> Bool
/= minimum [1,2,3,4], /= maximum [1,2,3,4] :: Int -> Bool
您已尝试将两个Int -> Bool
函数与Bool -> Bool -> Bool
运算符相关联。您需要将它们包装在lambda中(并应用缺少的Int
)或放入数组并使用all
。
答案 2 :(得分:1)
@josejuan已经给了一个免费的风格。除此之外我会选择:
f xs = filter (flip notElem $ [maximum, minimum] <*> pure xs) xs
对于应用程序,它变得更加灵活,假设您还希望过滤等于列表中第一个和最后一个元素的元素:
f xs = filter (flip notElem $ [maximum, minimum, head, last] <*> pure xs) xs
> f [2,1,5,3,42]
[5,3]