Меньше, чем функция в SML - PullRequest
1 голос
/ 23 марта 2012

Я столкнулся с двумя непонятными проблемами в SML и надеялся, что кто-нибудь мне поможет:

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

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

Но я получаю bool * 'список -> bool, но мне нужен' 'a *' 'список ->bool

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

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

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

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

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

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

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

0 голосов
/ 10 ноября 2012

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

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

fun elFromList (e, nil) = [] |elFromList (e, x :: xs) = если e = x, то elFromList (e, xs) иначе x :: elFromList (e, xs);

Удачи !!

...