2014-10-27 3 views
0

Я только начинаю работать со стандартным мл и действительно имею некоторые проблемы с пониманием списка на этом языке. Итак, мой вопрос заключается в том, как сократить список в мл? Например, если у меня есть список [1,2,3,4,5,6], я хочу сократить его до [1,2]. Что я имею до сих пор:Как сократить список в стандарте ml

fun shorten(i, l) = let val newlen = i in newlen = length l//in correct 

, что я хочу, это функция, которая будет принимать я, как место, что пользователь хочет, чтобы сократить список и л является список. В этом случае вход должен выглядеть shorten(2, [1,2,3,4,5,6] и вывод должен выглядеть [1,2]

+0

Вместо того, чтобы писать произвольный код, какие идеи у вас есть, что могло бы способствовать написанию правильного решение? – pyon

+0

То, что я пишу выше, это то, что я получил до сих пор, что я пытаюсь сделать, это создать переменную newlen, которая равна i, и установить ее равной новой длине списка. Я новичок в мл, так что я потерял здесь. – user4075830

ответ

1

Эта функция должна сделать это:

fun shorten(_, nil) = nil 
    | shorten(0, _) = nil 
    | shorten(i, x::xs) = x::shorten(i - 1, xs) 

Как вы заметили, эта функция не выбрасывает никаких исключений, когда i больше чем длина списка. Подход, который использует исключения бы это:

exception IllegalArgument 

fun shorten(_, nil) = nil 
    | shorten(0, _) = nil 
    | shorten(i, x::xs) = 
    if i > length(x::xs) then raise IllegalArgument 
    else x::shorten(i - 1, xs) 

В SML вам нужно объявить любой тип исключения с exception, прежде чем она поднята с помощью raise. В противном случае тип исключения не связан в среде, и интерпретатор будет жаловаться на неизвестный символ.

+0

Спасибо. Могу ли я спросить, как проверить ошибку в этом случае? что у меня есть: 'fun shorten (_, nil) = raise Ошибка | shorten (0, _) = raise Ошибка | shorten (i, x :: xs) = if i> length (x :: xs), затем поднять Error else x :: revert ((i-1), xs) <html> ' , похоже, не работает – user4075830

1

SML Basis Library содержит функцию List.take для выполнения требуемой задачи как части List Structure.

- fun shorten (toHowMany, myList) = List.take (myList, toHowMany) ; 
val shorten = fn : int * 'a list -> 'a list 

- shorten (2, [1,2,3,4,5,6]) ; 
val it = [1,2] : int list 

Если порядок аргументов не имеет значения, то List.take можно использовать непосредственно:

- List.take ([1,2,3,4], 2) ; 
val it = [1,2] : int list 
Смежные вопросы