如何修復這個exists'
函數使其能夠按需要工作?以遞歸的方式正確地寫入存在函數
測試列表中的任何元素是否滿足給定的條件。
exists' :: (a -> Bool) -> [a] -> Bool
exists' p [] = False
exists' p (x:xs)
| p == x = True
| otherwise = exists' p xs
如何修復這個exists'
函數使其能夠按需要工作?以遞歸的方式正確地寫入存在函數
測試列表中的任何元素是否滿足給定的條件。
exists' :: (a -> Bool) -> [a] -> Bool
exists' p [] = False
exists' p (x:xs)
| p == x = True
| otherwise = exists' p xs
只是檢查在病房過值的函數:
exists' :: (a -> Bool) -> [a] -> Bool
exists' _ [] = False
exists' f (x:xs)
| f x = True
| otherwise = exists' f xs
f
是(a -> bool)
型,x
的類型是a
ERGO f a
會返回一個布爾值,如果計算結果爲True您剛纔「return」也是如此,否則就像你在做的那樣進行遞歸調用。
由於@DanielSanchez他回答說,問題是,你寫p == x
,而不是p x
等等,而不是呼籲列表的頭部謂詞的,你檢查謂詞是等於到列表的頭部。因此,x
也應該是類型a -> Bool
(或p
類型a
)和類型p
和x
應該由Eq
類的實例。
可以使代碼有點更優雅,如:
exists' :: (a -> Bool) -> [a] -> Bool
exists' _ [] = False
exists' p (x:xs) = p x || exists' p xs
因爲現在它讀取語法:存在於滿足給出的列表中給出的謂詞列表中的元素不是空的,謂詞是列表的頭真,或這樣的元素存在於名單」的剩餘部分。
最後,我們也能避免將謂語的遞歸調用,由我們荷蘭國際集團一where
條款,如:
exists' :: (a -> Bool) -> [a] -> Bool
exists' p = helper
where helper [] = False
helper (x:xs) = p x || helper xs
注意,你不必自己寫exists'
。有語義上等價的any :: Foldable t => (a -> Bool) -> t a -> Bool
函數。
謝謝。幫助很多! – Atir