Функции высшего порядка в SML / NJ - PullRequest
0 голосов
/ 05 февраля 2012

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

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)*));

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

Ответы [ 2 ]

4 голосов
/ 05 февраля 2012

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

  • Вы почти никогда не используете циклы в 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).

1 голос
/ 05 февраля 2012

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

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

...