gpt4 book ai didi

haskell - 为什么 Haskell 的 Data.List.deleteBy 输入一个比较函数(a -> a -> Bool)和一个值而不是谓词(a -> Bool)?

转载 作者:行者123 更新时间:2023-12-03 15:08:33 26 4
gpt4 key购买 nike

我有一个与 Data.List 和 deleteBy 的签名有关的问题.理想情况下,此函数应输入谓词并删除谓词为真的第一个元素。就像是:

deleteBy :: (a -> Bool) -> [a] -> [a]
deleteBy p = go
where go [] = []
go (x:xs) | p x = xs
| otherwise = x:go xs

相反,库中定义的函数同时接受谓词和值:
deleteBy                :: (a -> a -> Bool) -> a -> [a] -> [a]
deleteBy _ _ [] = []
deleteBy eq x (y:ys) = if x `eq` y then ys else y : deleteBy eq x ys

很容易看出 eq始终与 x 一起使用作为第一个参数和 x固定在 deleteBy ,所以没有理由同时获得 eqx而不是 eq x .相反,通过对单个元素使用谓词,您可以传递不比较两个值的谓词,例如对 a 类型的一部分起作用的函数。或像 cons true 这样的微不足道的函数.我的问题是:为什么 deleteBy已经这样实现了吗?

最佳答案

deleteBy函数是 delete 的泛化, 所以看看 delete 会很有帮助第一的。

delete :: Eq a => a -> [a] -> [a]
delete取值 Eq a => a ,然后从 [a] 中删除该值的第一次出现使用 (==)来自 Eq实例。

与所有 *By 一样 Data.List 中的函数, Eq约束被删除,程序员需要提供他们自己的替换 (==)功能。

所以删除 Eq来自 delete 的约束并将其替换为 (==) 的类型,即 a -> a -> Bool , 为您提供 deleteBy 的类型.

换句话说,这是为了与 *By 的其余部分保持一致。 Data.List 中的操作.

关于haskell - 为什么 Haskell 的 Data.List.deleteBy 输入一个比较函数(a -> a -> Bool)和一个值而不是谓词(a -> Bool)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23000665/

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