我想撰寫一個函式來檢查兩個串列是否“幾乎”相等。第一個引數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)
我錯過了什么?任何幫助將不勝感激!
uj5u.com熱心網友回復:
不確定這是否是一個錯字,但你沒有傳遞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)應用于結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/440936.html
上一篇:根據過濾器或映射重新定義放置功能
