2017-05-24 19 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のですが、それは単にTrueにあなたを評価された場合エルゴf aは、ブール値を返しますタイプaであります"return" Trueも返します。そうでなければ、再帰呼び出しを行います。

+0

ありがとうございました。たくさん助けて! – Atir

1

@DanielSanchezが彼の答えで述べたように、問題は、あなたの代わりに、リストの先頭に述語を呼び出すので、代わりにp xp == xを書くことである述語は、リストの先頭に等しいある場合は、ご確認ください。その結果、xa -> Bool(またはタイプap)で、pおよびxのタイプはEqクラスのインスタンスである必要があります。

あなたが好きな、もう少しエレガントなコードを作ることができます。今では読み込むので

exists' :: (a -> Bool) -> [a] -> Bool 
exists' _ [] = False 
exists' p (x:xs) = p x || exists' p xs

構文的:リスト与えられている特定の述語を満たすリストの要素が存在するが空でないと述語は、リストの先頭のために、またはそのような要素は、「リストの残りの部分に存在する事実である。

最後に私達は私達によって、再帰呼び出しで述語を渡してもを回避することができますあなたはexists'を自分で記述する必要はありません

exists' :: (a -> Bool) -> [a] -> Bool 
exists' p = helper 
    where helper [] = False 
      helper (x:xs) = p x || helper xs

注:where句、などをINGの。意味的に同等な機能はany :: Foldable t => (a -> Bool) -> t a -> Boolです。

関連する問題