Пример рекурсивной функции Haskell с помощью foldr

После небольшого перерыва я снова начал изучать Хаскель и сейчас пытаюсь лучше понять, как рекурсия и лямбда-выражения работают в Хаскеле.

В этом:YouTube видео, есть пример функции, который озадачивает меня гораздо больше, чем, вероятно, следовало бы, с точки зрения того, как это на самом деле работает:

firstThat :: (a -> Bool) -> a -> [a] -> a
firstThat f = foldr (\x acc -> if f x then x else acc)

Для ясности и поскольку это не было для меня сразу очевидно, я приведу пример применения этой функции к некоторым аргументам:

firstThat (>10) 2000 [10,20,30,40] --returns 20, but would return 2000, if none of the values in the list were greater than 10

Пожалуйста, поправьте меня, если мои предположения неверны.

Похоже на тоfirstThat принимает три аргумента:

функция, которая принимает один аргумент и возвращает логическое значение. Поскольку> оператор на самом деле является инфиксной функцией, первый аргумент в приведенном выше примере кажется результатом частичного применения к> функция - это правильно?ожидается неопределенное значение того же типа, что и отсутствующий аргумент функции, предоставленной в качестве первого аргументасписок значений вышеуказанного типа

Но фактическая функцияfirstThat похоже, что он определен не так, как его объявление типа, только с одним аргументом. посколькуfoldr обычно принимает три аргумента, которые я собрал, происходит какое-то частичное применение. Лямбда-выражение предоставляется в качестве аргументаfoldr похоже, тоже не хватает своих аргументов.

Итак, как именно эта функция работает? Я извиняюсь, если я слишком плотный или не вижу леса за деревьями, но я просто не могу обернуть его вокруг, что расстраивает.

Любое полезное объяснение или пример (ы) будут с благодарностью.

Спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос