Haskell 检查两个列表之间差异的函数

Haskell function to check differences between two lists

我想编写一个函数来检查两个列表是否“几乎”相等。第一个参数 d 用于精度 - 元素之间的差异不得超过 d.

例如,nearlyEqual 0.5 [2,5] [2.5, 5.1] 等于 True,但 nearlyEqual 0.1 [2,5] [2.5, 5.1] 等于 False

我写了这个但是没有用:

nearlyEqual :: Int -> [Int] -> [Int] -> Bool
nearlyEqual d xs ys = foldr(&&) True $ zipWith (\x y -> abs(x-y)<=d)

我错过了什么?任何帮助将不胜感激!

不确定这是不是打字错误,但您没有将 xsys 传递给您的函数。

nearlyEqual d xs ys = foldr(&&) True $ zipWith (\x y -> abs(x-y)<=d)

应该是

nearlyEqual d xs ys = foldr(&&) True $ zipWith (\x y -> abs(x-y)<=d) xs ys

至少要进行类型检查。

更清晰的实现将使用类型为 Foldable t => (a -> Bool) -> t a -> Boolall 和函数组合运算符 (.):

nearlyEqual d xs ys = all ((<= d) . abs) $ zipWith (-) xs ys

其中 zipWith (-) xs ys 是两个列表的 element-wise 差异,并且 all 验证谓词 (<= d) . absall[=34= 成立] 该列表的元素;给定一个参数,谓词对其应用 abs,然后对结果应用 (<= d)