Рассматривая проблему, становится очевидным, что мы, вероятно, захотим обрабатывать два входных элемента одновременно.
Итак, давайте посмотрим, что мы хотим сделать с каждой парой: если 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 _ = []