Менее чем функция в стандартном ML - PullRequest
0 голосов
/ 26 марта 2012

Я пытаюсь создать функцию в SML, которая принимает список и целое число и возвращает список всех элементов, которые меньше целого int * int list -> int list Я написал следующий код:

- fun less (e, L) = 
=   map (fn a => if a < e then a else []) L;

также со следующим кодом это не работает также:

- fun less (e, L) = 
=   map (fn a => if a < e then a) L;

и ошибка, которую я получаю:

stdIn:22.15-22.38 Error: types of if branches do not agree [overload]
  then branch: 'Z
  else branch: 'Y list
  in expression:
    if a < e then a else nil

Я думаю, что проблема с остальной частью, но я не знаю, чтопоставить его на работу, кто-нибудь есть какие-либо предложения?Я должен использовать функции map, foldl или foldr.

EDIT:

- fun less (e, L) = 
=   let
=       val acc = []
=   in
=       foldr (fn a => if a < e then a::acc else acc) acc L
=   end;

по-прежнему выдает ошибку, следующая ошибка:

stdIn:241.3-241.54 Error: operator and operand don't agree [overload]
  operator domain: 'Z * 'Y -> 'Y
  operand:         'X -> 'X list
  in expression:
    foldr (fn a => if <exp> < <exp> then <exp> :: <exp> else acc)

1 Ответ

1 голос
/ 26 марта 2012

Сообщение об ошибке ясно; поскольку a имеет тип int, а [] имеет тип 'a list, их типы не совпадают.

Проблема в том, что вы выбрали неправильную функцию высокого порядка для задачи. Структура filter on List лучше всего подходит здесь:

fun less (e, L) = filter (fn a => a < e) L

Вы можете использовать рекурсию для явной реализации less или использовать foldl/foldr для накопления отфильтрованных списков. Однако map здесь не имеет значения.

EDIT:

Я дам подсказку об использовании foldl/foldr. Вы начинаете с пустого списка в качестве аккумулятора. Добавлять элемент к аккумулятору, когда этот элемент меньше e; в противном случае верните аккумулятор.

РЕДАКТИРОВАТЬ 2:

Вы забыли передать acc в качестве аргумента в лямбда-функцию:

fun less (e, L) = foldr (fn (a, acc) => if a < e then a::acc else acc) [] L

А часть let..in..end является избыточной, поскольку вы используете [] только в качестве аккумулятора.

...