2017-05-24 63 views
2

如何修復這個exists'函數使其能夠按需要工作?以遞歸的方式正確地寫入存在函數

測試列表中的任何元素是否滿足給定的條件。

exists' :: (a -> Bool) -> [a] -> Bool 

exists' p [] = False 
exists' p (x:xs) 
    | p == x = True 
    | otherwise = exists' p xs 

回答

3

只是檢查在病房過值的函數:

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」也是如此,否則就像你在做的那樣進行遞歸調用。

+0

謝謝。幫助很多! – Atir

1

由於@DanielSanchez他回答說,問題是,你寫p == x,而不是p x等等,而不是呼籲列表的頭部謂詞的,你檢查謂詞是等於到列表的頭部。因此,x也應該是類型a -> Bool(或p類型a)和類型px應該由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函數。