2012-03-23 3 views
1

Я пришел через 2 запутанных проблем в SML и надеялся, что кто-то может помочь мне:Менее функции в SML

Первым из них является функция, которая принимает элемент и список и решает, существует ли элемент в список или нет, вот код, который я пытался написать:

fun member (e,L) = foldl (fn(a,b) => if (e = b) then true else false) false L; 

но я получаю Ие * «список -> Bool, но то, что мне нужно это„“а *„“списка - > bool

Что касается второго, для него также требуется элемент и список, но он возвращает список элементов, меньший, чем прошел один. Я не уверен, что это должно быть сделано через карту или foldr/foldl. Любые предложения?

Заранее спасибо :)

+1

Обратите внимание, что 'if (e = b), тогда true else false' является просто сложным способом сказать' e = b'. –

ответ

3

Что касается первого вопроса, в fn (a, b) => ...a является следующим элементом и b является аккумулятором. Так как вы сравниваете e с b, то имеет значение bool. Вы должны сравнить e с a, и никогда не переопределяют b, когда он становится true:

fun exists (e, L) = 
    foldl (fn (a, b) => e = a orelse b) false L 

Что касается второго вопроса, то вы можете использовать foldr/foldl сделать это. Это похоже на первый пример; вы начинаете с пустого списка в качестве аккумулятора и добавляете ему элемент, когда этот элемент меньше порога.

В качестве компромисса foldr дает вам правильный заказ, но он не является рекурсивным. С другой стороны, foldl является хвостовым рекурсивным, но дает результирующие списки в обратном порядке.

+0

Спасибо большое :) Мне удалось решить вторую проблему, используя foldl, а также – AuthenticReplica

+1

И если if = a, то true else b' может быть сокращено до 'e = a orelse b'. ;) –

+0

@AndreasRossberg: Спасибо, я обновил ответ после вашего предложения. – pad

0

Чтобы посмотреть, есть ли элемент в списке или нет, выполните следующие действия: fun elementExist (e, nil) = false | elementExist (e, x :: xs) = если e = x orelse elementExist (e, xs), тогда true else false;

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

весело elFromList (е, ноль) = [] | elFromList (e, x :: xs) = если e = x, то elFromList (e, xs) else x :: elFromList (e, xs);

Удачи !!

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