Самый правильный способ перебрать список в haskell и вернуть элемент, для которого выполняется условие - PullRequest
0 голосов
/ 01 июня 2019

У меня есть функция, которая принимает некоторый аргумент и вызывает другую функцию, которая возвращает список в форме [a_1, a_2, ..., a_n].

Я пытаюсь вызвать предикатp для каждого элемента в списке и возвращает элемент, для которого p (a_i) = True.

Если нет, то я буду рекурсивно повторять алгоритм для всех a_i.

Структураследующим образом:

f :: t -> t
f =  (g t) --this is a list
     (p ?) -- p is a predicate on each element 

Я хочу вызвать этот предикат p для каждого элемента в списке, а затем вернуть элемент, если предикат имеет значение true.

Если предикат не выполняется для всех элементовзатем я рекурсивно вызываю f для каждого элемента в списке, который, как я понимаю, даст мне кратное «t», которое я знаю, как объединить в один t, чтобы соответствовать моей подписи.

Я нашел это:

Как выйти из цикла итерации при выполнении условия?

Но структура условия выглядит иначе, чем то, что я пытаюсь сделать.

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

0 голосов
/ 01 июня 2019

Как насчет того, чтобы определить

satisfies:: [t]-> (t -> Bool) -> Maybe t

, что означает, что satisifies принимает список и предикат и возвращает Maybe элемента .Это один из способов указать, что не может быть элемента, удовлетворяющего предикату (это делает функцию total , то есть всегда определяется).

Теперь, если список пуст,возврат Nothing:

satisfies [] _ = Nothing

Наконец,

satisfies (x:xs) p = case p x of
    True -> Just x
    False -> satisfies xs p
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...