2012-02-04 5 views
0

Я ищу помощь с проблемой. Я пытаюсь написать функцию, которая передает список и функцию в ML. В основном, что программа должна делать, это взять список и запустить каждый элемент через функцию. Если функция возвращает true, то элемент добавляется в список, а список возвращается после завершения функции. Вот мой код:Функции более высокого порядка в SML/NJ

fun select(x:list, funct)=  (* Define a new function that accepts a list and the prime function as a parameter*) 
    while (tl(x) not nil) do(  (*While the tail is not empty*) 
      if funct(hd(x)) then (*Then run the function with the the head*) 
        val l = l::hd(x)  (*Adds the head of x to the list *) 
      (*else 1+tl(x)*)); 

Любая помощь будет очень признательна.

ответ

1

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

Это точно встроенная функция List.filter. Не нужно изобретать велосипед.

+0

'Нет необходимости изобретать велосипед' ​​... Если это не домашняя работа;) –

+0

Правда, но не было домашней метки по этому вопросу :) –

+0

Жаль, что я не указал. Это было домашнее задание. – mikeyGlitz

4

Несколько указателей:

  • Вы очень много никогда не использовать циклы в ML. Каждый раз, когда вам нужно итерации, записывайте рекурсивную функцию.
  • Вам редко нужно указывать типы. В этом случае ML может вывести из факта, что вы вызываете tl(x), что x должен быть списком.
  • Вместо того, чтобы использовать hd(x) и tl(x) для разложения списка, вы обычно делаете это с помощью шаблонов, соответствующих в аргументах функции. Вместо одного аргумента x напишите аргумент как x::xs; x будет назначен главе списка, а xs - на хвост.
  • Вместо использования условных операторов для проверки структуры вашего аргумента (в этом случае, является ли ваш список пустым или нет), вы можете написать несколько определений функций с разными шаблонами. ML попробует их один за другим, пока не найдет тот, который подходит.
  • Тело вашей функции должно быть выражено , которое оценивает ваше возвращаемое значение. Все в ML - выражение; даже if x then a else b по существу является функцией, которая возвращает либо a, либо b.

Имея все это в виду, вот что-то, чтобы вы начали:

fun select([], funct) = [] 
| select(x::xs, funct) = ... 

Два случая здесь заменить while условие - первый будет оцениваться только тогда, когда ваш список nil. Образец во втором случае автоматически присваивает значения заголовку и хвосту вашего списка. Это определение должно быть рекурсивным; select([],funct)=[] - ваш базовый кейс, а select(x::xs,funct)=... должен включать в себя вызов select(xs,funct).