Объединить функции в SML - PullRequest
       5

Объединить функции в SML

3 голосов
/ 24 сентября 2010

Эй, я очень новичок в SML и программировании в целом, я хочу написать функцию, которая объединяет в списки, так что [x1, x2, x3, x4, ...] = [(x1, x2), (x3, x4), ...] Любые намеки или помощь для меня в правильном направлении очень приветствуются.

Ответы [ 2 ]

3 голосов
/ 24 сентября 2010

Рассматривая проблему, становится очевидным, что мы, вероятно, захотим обрабатывать два входных элемента одновременно.

Итак, давайте посмотрим, что мы хотим сделать с каждой парой: если x1 и x2Из элементов, которые мы сейчас рассматриваем, мы хотим поместить пару (x1, x2) в список, который мы создаем.Если xs - это список элементов, которые идут после x1 и x2, мы хотим, чтобы за парой (x1, x2) следовал результат "объединения" xs.Таким образом, мы можем написать нашу функцию объединения как:

fun combineWithin (x1::x2::xs) = (x1, x2)::(combineWithin xs)

Однако это определение еще не завершено.Мы рассматриваем только случай, когда в xs есть как минимум два предмета.Поэтому мы должны спросить себя, что мы хотим сделать в двух других случаях.

Для пустого списка это легко: результатом объединения пустого списка является пустой список.

ДляВ списке только с одним элементом мы можем либо вернуть пустой список, либо выдать ошибку (или, возможно, связать один элемент с самим собой).Другими словами: нам нужно решить, должен ли combineWithin [1,2,3] возвращать [(1,2)] или [(1,2), (3,3)] или выдавать ошибку.

Если мы решим, что хотим первое, наша функция становится:

fun combineWithin (x1::x2::xs) = (x1, x2)::(combineWithin xs)
  | combineWithin _ = []
0 голосов
/ 24 сентября 2010
let rec pairs = function
| [] -> []
| [x] -> []
| x1::x2::rest -> (x1, x2)::(pairs rest)
...