过滤功能免分
Point-free for filter function
是否存在 filter
函数的无点函数来查找列表中第一个元素的最小值?例如:
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)]
如何将findMinimum
函数转换为无点:
findMinimum = ??
pointfree.io 输出这个,还不错。不过我还是更喜欢原来的代码。
findMinimum = filter =<< (. fst) . (==) . minimum . map fst
不同的实现
head . groupBy ((==) `on` fst) . sortOn fst
首先排序和分组,选择第一个子列表。也许您可能想要显式处理空列表。
将对放在 Arg
中,您将在第一个元素上排序,您可以按如下方式利用它:
import Data.Semigroup (Arg(..))
import Data.Ord (comparing)
findMinimum :: Ord a => [(a, b)] -> (a, b)
findMinimum = minimumBy (comparing (uncurry Arg))
是否存在 filter
函数的无点函数来查找列表中第一个元素的最小值?例如:
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)]
如何将findMinimum
函数转换为无点:
findMinimum = ??
pointfree.io 输出这个,还不错。不过我还是更喜欢原来的代码。
findMinimum = filter =<< (. fst) . (==) . minimum . map fst
不同的实现
head . groupBy ((==) `on` fst) . sortOn fst
首先排序和分组,选择第一个子列表。也许您可能想要显式处理空列表。
将对放在 Arg
中,您将在第一个元素上排序,您可以按如下方式利用它:
import Data.Semigroup (Arg(..))
import Data.Ord (comparing)
findMinimum :: Ord a => [(a, b)] -> (a, b)
findMinimum = minimumBy (comparing (uncurry Arg))