我正在嘗試使用遞回撰寫一個函式eval :: Int -> Bool,如果給定一個串列,其中每個奇數都大于 10,則該函式回傳 true。例如:
eval [] == True
eval [1] == False
eval [2] == True
eval [1, 11, 21] == False
eval [2, 12, 22] == True
eval [21, 11] == True
我必須使用遞回來做到這一點,我有一個基本代碼:
eval :: [Int] -> Bool
eval [] = True
eval (x:xs) | mod x 2/= 0 && x > 10 = True
| otherwise = eval xs
代碼運行,但它不適用于奇數大于 10 作為第一個輸入的串列,因為它以串列的第一個值作為標準。我認為首先按升序對串列進行排序,然后執行遞回會起作用,這是正確的,如果是這樣,我該如何實作它?
uj5u.com熱心網友回復:
你應該不回傳True如果mod x 2 /= 0 && x > 10。那時我們仍然需要尋找其余的數字。
因此,只有當專案為偶數或專案大于 10 時,我們才能在尾部遞回。 事實上,如果一個專案是偶數,則足以繼續,如果不是,我們需要驗證該數字大于10.
因此,該eval函式適用于:
eval :: [Int] -> Bool
eval [] = True
eval (x:xs) | even x || x > 10 = eval xs
| otherwise = False
我們可以通過以下方式簡化:
eval :: [Int] -> Bool
eval [] = True
eval (x:xs) = (even x || x > 10) && eval xs
或使用foldr模式:
eval :: (Foldable f, Integral a) => f a -> Bool
eval = foldr (\x -> ((even x || x > 10) &&)) True
或與all :: Foldable f => (a -> Bool) -> f a -> Bool:
eval :: (Foldable f, Integral a) => f a -> Bool
eval = all (\x -> even x || x > 10)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/326798.html
