gpt4 book ai didi

haskell 通过函数检查相等性

转载 作者:行者123 更新时间:2023-12-02 16:09:45 26 4
gpt4 key购买 nike

在 haskell 中我可以使用

sortBy (comparing snd) 

按元组中的第二个值排序。

是否有用于测试等效性的等效函数?我已经想出了这个,但也许标准库中有一些东西。

equalsBy :: Eq b => (a -> b) -> a -> a -> Bool
equalsBy f x y = f x == f y

最终目标是按第二个值对一系列对进行分组。有了这个我就可以做到

groupBy (equalsBy snd) pairs

而不是

groupBy (\x y -> (snd x) == (snd y)) pairs

最佳答案

您正在寻找一个稍高级别的函数,名为 on :

> import Data.Function
> :t on
on :: (b -> b -> c) -> (a -> b) -> a -> a -> c

那么我该如何使用它呢?像这样!

> :t ( (==) `on` snd )
( (==) `on` snd ) :: Eq b => (a, b) -> (a, b) -> Bool

这意味着我们想要:

> groupBy ( (==) `on` snd) [ (1,3), (23,9), (42,9), (1,3), (48, 3), (18,18)]
[[(1,3)],[(23,9),(42,9)],[(1,3),(48,3)],[(18,18)]]

耶!

编辑:

我想说明一下比较on之间的关系。它只是 on 的特殊用法!

> :t comparing
comparing :: Ord a => (b -> a) -> b -> b -> Ordering
> :t (compare `on`)
(compare `on`) :: Ord b => (a -> b) -> a -> a -> Ordering

(注意类型变量已交换,但您可以看到类型是相同的)

关于haskell 通过函数检查相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21175602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com