我想写一个函数来检查两个列表是否是";几乎";相同的第一个参数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)
我错过了什么?如有任何帮助,我们将不胜感激!
不确定这是否是拼写错误,但您没有将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
至少可以进行打字检查。
更清晰的实现将使用Foldable t => (a -> Bool) -> t a -> Bool
类型的all
和函数组合运算符(.)
:
nearlyEqual d xs ys = all ((<= d) . abs) $ zipWith (-) xs ys
其中,zipWith (-) xs ys
是两个列表的元素差,并且all
验证谓词(<= d) . abs
对于该列表的所有元素的成立;谓词,给定一个自变量,将abs
应用于它,然后将(<= d)
应用于结果。