【问题标题】:Is there a standard library solution to this Haskell problem?这个 Haskell 问题有标准库解决方案吗?
【发布时间】:2011-11-20 14:24:36
【问题描述】:

我想使用 Data.List.groupBy 根据 snd 元素的相等性对元组列表进行分组。
我可以这样做:

groupBy (\l r -> snd l == snd r) listOfTuples

但我觉得比较函数中的样板太多了——尤其是因为如果我进行更复杂的比较,它可能会变得更加混乱。我想做类似的事情:

groupBy (comparing snd) listOfTuples

但是比较的类型签名是comparing :: (Ord a) => (b -> a) -> b -> b -> Ordering,所以在这个例子中不能编译。
我也可以这样做:

groupBy (\l r -> (comparing snd l r) == EQ) listOfTuples

但这并不比第一次尝试更好。在我自己动手之前,是否有针对此问题的标准库解决方案?

【问题讨论】:

    标签: haskell functional-programming standard-library


    【解决方案1】:

    这是你想要的吗?

    groupBy ((==EQ) . comparing snd) listOfTuples
    

    【讨论】:

    • 嗯,我一直认为。很神奇。但可惜不是。我认为有一个提升功能可能会做类似的事情。 lift :: (a->b) -> (c->d->b) -> c -> d。正如@Daniel Wagner 建议的那样,Hoogle 给了我on
    • 你可以写成groupBy (((== EQ).) . comparing snd) listOfTuples。注意部分应用的函数组合。
    【解决方案2】:
    groupBy ((==) `on` snd) listOfTuples
    

    我认为标准库中曾经有equating = on (==),但我现在似乎找不到它。

    【讨论】:

    猜你喜欢
    • 2020-12-15
    • 2011-07-04
    • 2021-01-10
    • 2021-02-26
    • 2021-10-14
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多