2015-10-31 2 views
0

Я использую SML недавно, и я пытаюсь решить проблему. я должен создать функцию, которые принимают список Int и возвращать даже Int список, Я уже создал его:SML/NJ возвращает даже целые числа из списка int с foldr

fun evens [] = [] | 
evens [x] = [x] | 
evens(x::xs) = 
case x mod 2 of 
0 => x::evens xs | 
1 => evens xs; 

, которая дает правильный результат, но мне нужно использовать foldr это то, что я придумал с:

fun evens [] = [] | 
evens(x::xs) = 
case x mod 2 of 
0 => foldr (op ::) evens xs [x] | 
1 => evens xs; 

, но он не работает, я до сих пор путают с тем, как использовать foldr в этом случае.

любой совет?

ответ

1

Прежде всего, с 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 

 Смежные вопросы

  • Нет связанных вопросов^_^