【发布时间】:2014-04-10 23:06:13
【问题描述】:
我有一个关于 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 中,因此没有理由同时使用eq 和x 而不是@ 987654331@。相反,通过对单个元素使用谓词,您可以传递不比较两个值的谓词,例如适用于 a 类型的一部分的函数或像 cons true 这样的普通函数。我的问题是:为什么deleteBy是这样实现的?
【问题讨论】:
-
相关答案:stackoverflow.com/questions/9004937/…。与
(==)类型的一致性听起来像是一个合理的解释。 -
虽然很容易解决(func . const)
标签: haskell