Учитывая список создать список кортежей SML - PullRequest
0 голосов
/ 01 мая 2020

Здравствуйте. Я новичок в Sml / nj и пытаюсь изменить входные данные, чтобы передать его функции. Я застрял в изменении ввода.

В частности, я читаю ввод и сохраняю его в виде списка. Я хочу создать функцию с заданным списком четной длины, он создаст новый список, но с кортежами из 2 элементов.
Например, если мой ввод - это список [2, 7, 4, 6, 5, 8] Я хочу создать этот список [(2, 7), (4, 6), (5, 8)]

Я пробовал это, но, к сожалению, это не работает:

fun maketuples [] = []
  | maketuples x::xs = (x, hd xs) @ makektuples (tl xs)

1 Ответ

2 голосов
/ 01 мая 2020

Здесь есть пара вещей:

  • Если вы сопоставляете шаблон с конструктором в качестве аргумента функции, вам нужно заключить его в круглые скобки, чтобы он анализировался так же, как вы как, например, x::xs -> (x::xs)

  • У вас есть опечатка во втором предложении (makektuples; дополнительные k)

  • Вы используете append (@) для int * int и (int * int) list. Тип этой функции на самом деле 'a list * 'a list, т. Е. Оба ее аргумента должны быть списками одного типа.

Мы могли бы пересмотреть это следующим образом:

fun maketuples [] = []
  | maketuples (x::xs) = [(x, hd xs)] @ maketuples (tl xs)

Но добавление синглтона на самом деле не то, что вы должны делать. Почему? Лучше использовать минусы:

fun maketuples [] = []
  | maketuples (x::xs) = (x, hd xs) :: maketuples (tl xs)

Мы можем исправить это еще немного, удалив вызовы hd и tl, просто уничтожив их в аргументах функции

fun maketuples [] = []
  | maketuples (x::y::xs) = (x, y) :: maketuples xs

и, возможно, вы могли бы обработать ошибку лучше (одна возможность, за исключением):

fun maketuples [] = []
  | maketuples (x::y::xs) = (x, y) :: maketuples xs
  | maketuples _ = raise Fail "Not an even length list"
...