Haskell 无点滤波函数

Haskell 无点滤波函数,haskell,filtering,pointfree,tacit-programming,Haskell,Filtering,Pointfree,Tacit Programming,是否存在一个无点函数用于过滤器函数来查找列表中成对元素的最小值?例如: findMinimum xs = filter ((== minimum (map fst xs)) . fst ) xs -- example: findMinimum [(0, 0), (0, 1), (2, 2), (3, 2), (1, 4)] = [(0, 0), (0, 1)] 如何将findminium函数转换为无点: findMinimum = ?? 输出这个,这不是太糟糕。不过,我还是更喜欢原始代码

是否存在一个无点函数用于
过滤器
函数来查找列表中成对元素的最小值?例如:

findMinimum xs =  filter ((== minimum (map fst xs)) . fst ) xs

-- example:
findMinimum [(0, 0), (0, 1), (2, 2), (3, 2), (1, 4)] = [(0, 0), (0, 1)]
如何将
findminium
函数转换为无点:

findMinimum = ??
输出这个,这不是太糟糕。不过,我还是更喜欢原始代码

findMinimum = filter =<< (. fst) . (==) . minimum . map fst

findminium=filter=不同的实现

head . groupBy ((==) `on` fst) . sortOn fst
首先按排序和分组,选择第一个子列表。也许您希望显式地处理空列表。

将该对放入,您将获得第一个元素的顺序,您可以按如下方式利用该元素:

import Data.Semigroup (Arg(..))
import Data.Ord (comparing)

findMinimum :: Ord a => [(a, b)] -> (a, b)
findMinimum = minimumBy (comparing (uncurry Arg))

每个函数都可以用无点形式编写;问题是,无点形式比有点形式读起来更好吗?是的,这并不太糟糕,我更喜欢无点形式,并投票支持它。存在更具可读性的答案吗?@JoeChoi我认为没有更好的答案了,因为有两次出现
xs
,所以需要类似
>=
的东西来“复制”隐式参数。使用
似乎会导致更糟糕的代码,我认为。@JoeChoi可能只是使用可选参数,
filter=当然,这将用O(n lg n)排序替换一对O(n)遍历。回答很好,谢谢。为了处理空列表,我对它进行了一些修改:
concat。以1为例。groupBy((==)
on`fst)。索顿fst`。我不认为这是O(n logn)(非正式地使用O)。谢谢。我投票赞成
比较(uncurry Arg)
以提供另一种方法,如
比较fst
。但是
findminium
将对的列表返回为
[(a,b)]
,而不是
(a,b)