0

我想编写一个函数来检查两个列表是否“几乎”相等。第一个参数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)

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

4

1 回答 1

3

不确定这是否是一个错字,但你没有传递xs和传递ys给你的函数。

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

至少要进行类型检查。

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

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

其中zipWith (-) xs ys是两个列表的元素差异,并all验证谓词是否(<= d) . abs适用于该列表的所有元素;谓词,给定一个参数,应用于abs它,然后(<= d)应用于结果。

于 2022-03-05T13:55:19.707 回答