Я начал изучать Haskell снова, после короткого перерыва, и в настоящее время я пытаюсь лучше понять, как рекурсия и лямбда-выражения работают в Haskell.Пример рекурсивной функции Haskell с foldr
В этом: YouTube video, есть функция пример того, что озадачивает меня гораздо больше, чем это, вероятно, следует, с точки зрения того, как она на самом деле работает:
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
принимает три аргумента:
- функцию, которая принимает один аргументы и возвращает логическое значение. Поскольку оператор
>
фактически является функцией infix, первый аргумент в приведенном выше примере кажется результатом частичного приложения к функции>
- это правильно? - неопределенное значение того же типа, как ожидается, как отсутствующий аргумент функции, представленной в качестве первого аргумента
- список значений вышеупомянутого типа
Но фактической функции firstThat
, кажется, определяется по-разному из его объявления типа, с одним аргументом. Поскольку foldr
обычно принимает три аргумента, которые я собрал, происходит какое-то частичное приложение. Лямбда-выражение, представленное в качестве аргумента foldr
, похоже, также не содержит аргументов.
Итак, как именно эта функция работает? Прошу прощения, если я слишком плотный или не вижу лес для деревьев, но я просто не могу обмотать голову вокруг него, что разочаровывает.
Любое полезное объяснение или пример (ы) были бы весьма признательны.
Спасибо!
Извините за опечатки и спасибо за редактирование, duplode! – odiumediae
Кстати, в вашем 'firstThat' нет ничего рекурсивного, просто потому, что' foldr' помогает вам не рекурсивно переписывать рекурсивную функцию иначе, не означает, что вы должны ссылаться на любую функцию, которая использует 'foldr' как рекурсивную , –
Спасибо, я понимаю, что вы имеете в виду, и, конечно, это имеет смысл. У меня есть намного больше, чем я думал. – odiumediae