gpt4 book ai didi

haskell - 我们如何基于函数简洁地定义Eq?

转载 作者:行者123 更新时间:2023-12-02 10:52:31 25 4
gpt4 key购买 nike

我们可以使用Data.Ord.comparing编写简洁的 Ord 实例:

comparing :: Ord a => (b -> a) -> b -> b -> Ordering
comparing p x y = compare (p x) (p y)

f :: b -> a

instance Ord a => Ord b where compare = comparing f

我希望找到一些类似的函数来帮助定义 Eq 实例:

-- Does something like this exist?
equalityOn :: Eq a => (b -> a) -> b -> b -> Bool
equalityOn p a b = p a == p b

instance Eq a => Eq b where (==) = equalityOn f

Hoogle 没有发现带有此签名的任何内容,因此我猜测这不是定义 Eq 的常用方法。显然这不是一个很难解决的问题,但是惯用的方法是什么?

最佳答案

完成此操作的方法是使用 Data.Function.on 内联重现您的 equalityOn 函数。 ,其类型为

on :: (b -> b -> c) -> (a -> b) -> a -> a -> c

此函数概括了比较:

(.*.) `on` f = \x y -> f x .*. f y

(从基数开始 literally the implementation)。因此,我们有 compareing = (compare `on`); on 通过将任何二元函数应用于一元函数的结果来提升任何二元函数。

因此 equalityOn 只是 ((==) `on`),并且您的示例实例变为

import Data.Function

instance Eq A => Eq B where
(==) = (==) `on` f
<小时/>

建议添加一个equating::Eq a => (b -> a) -> b -> b -> Bool(equalityOn的更常见名称) code>) 显然会定期出现; here's an example thread from July 2014 。普遍的共识似乎(一再)认为 ((==) `on`) 更可取,尽管不一定有很大优势。事实上,显然比较早于on,我记得曾经看到有人争论说,如果今天设计这个库,我们就不会两者比较也不是等同,只需在任何地方使用on即可!但是:您的里程可能会有所不同:-)(我在这里保持中立。)

关于haskell - 我们如何基于函数简洁地定义Eq?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35666703/

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