Прежде всего, с foldr
вы должны искать однострочное определение, а не рекурсивное определение с использованием шаблонов и случаев. Точка foldr
состоит в том, что она содержит общий шаблон рекурсии - вам просто нужно использовать шаблон.
Тип foldr
является
fn : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b
В вашем случае 'b
является int list
и 'a
является int
. 'b
между стрелками в середине foldr
- это начальное значение. Обычно это соответствует базовому значению. Когда вы создаете списки, это базовое значение обычно равно []
. Таким образом, вам нужно сосредоточиться на ключевом вопросе , который должен быть свернут. Другими словами - какую функцию типа ('a * 'b -> 'b)
вы должны перейти на foldr
? В вашем случае вам нужно передать функцию типа
int * int list -> int list
это должно быть функцией, которая, когда дан Int и список Int либо Гвозди ИНТ на список (если он еще) или выйдет из списка в одиночестве. Вы можете заранее определить эту функцию, определить ее с помощью let
или просто использовать анонимную функцию.
В предположении, что это домашнее задание, я не хочу, чтобы дать полный ответ, но здесь это функция, которая использует foldr
для получения положительных элементов в списке:
fun positives xs =
foldr (fn (x,xs) => if x >= 0 then x::xs else xs) [] xs;
-
- positives [3,~2,4,5,0,~1,~1,5];
val it = [3,4,5,0,5] : int list