創建一個 divisors :: Int -> [Int] 函式,回傳 x 的除數。
我已經成功地制作了一個divides函式,它回傳Trueify的除數x。
divides x y | mod x y == 0 = True
| mod x y /= 0 = False
我試圖用它來過濾來自 的數字[1..n],但不能完全掌握過濾器功能的作業原理。任何人都可以讓我朝著正確的方向前進嗎?
divisors n = filter divides n [1..n]
uj5u.com熱心網友回復:
你在正確的軌道上。只是您的問題不完全是過濾器的作業原理,而是 Haskell 的作業原理。
divisors n = filter (divides n) [1..n]
以上將解決問題。看,過濾器需要兩個引數,除數也是如此。但是您在filter divides n [1..n].
順便提一句,
divides x y | mod x y == 0 = True
| mod x y /= 0 = False
在語意上等同于
divides x y = mod x y == 0
并且在操作上它不會重復 mod 計算和 test mod x y /= 0。
uj5u.com熱心網友回復:
filter將要過濾的串列作為它的第二個引數——這里是你的[1..n]——以及作為第一個引數的函式,它將這些串列元素之一作為輸入并回傳一個布林值。
所以想想這個函式是什么,就你的預定義函式而言divides。因為,正如你所擁有的,divides x y實際上意味著“y是”的一個除數x,你可以很容易地用一個 lambda 函式來表達它:
divisors n = filter (\m -> divides n m) [1..n]
這可以通過“eta-reduction”(或通俗地講,“取消m”)進一步簡化為
divisors n = filter (divides n) [1..n]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/363876.html
標籤:哈斯克尔
下一篇:如何讓這個函式被懶惰地評估
