Haskell:从最小值和最大值过滤列表

时间:2014-09-25 08:05:19

标签: parsing haskell filter

我正在尝试删除列表中的最大值和最小值。

filter (/= minimum [1,2,3,4] && /= maximum [1,2,3,4] ) [1,2,3,4]

不幸的是,每当我尝试这样做时,我在输入“\ =”时得到一个解析错误 有谁知道这个错误背后的原因是什么以及如何解决它?

3 个答案:

答案 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]