この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
のですが、それは単にTrueにあなたを評価された場合エルゴf a
は、ブール値を返しますタイプa
であります"return" Trueも返します。そうでなければ、再帰呼び出しを行います。
@DanielSanchezが彼の答えで述べたように、問題は、あなたの代わりに、リストの先頭に述語を呼び出すので、代わりにp x
のp == x
を書くことである述語は、リストの先頭に等しいある場合は、ご確認ください。その結果、x
はa -> Bool
(またはタイプa
のp
)で、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
です。
ありがとうございました。たくさん助けて! – Atir