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)
我错过了什么?任何帮助将不胜感激!
不确定这是不是打字错误,但您没有将 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
是两个列表的 element-wise 差异,并且 all
验证谓词 (<= d) . abs
对 all[=34= 成立] 该列表的元素;给定一个参数,谓词对其应用 abs
,然后对结果应用 (<= d)
。
我想编写一个函数来检查两个列表是否“几乎”相等。第一个参数 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
是两个列表的 element-wise 差异,并且 all
验证谓词 (<= d) . abs
对 all[=34= 成立] 该列表的元素;给定一个参数,谓词对其应用 abs
,然后对结果应用 (<= d)
。