2010-09-24 4 views
3

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

ответ

3

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

Итак, давайте посмотрим, что мы хотим делать с каждой парой: Если 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 _ = [] 
-1
let rec pairs = function 
| [] -> [] 
| [x] -> [] 
| x1::x2::rest -> (x1, x2)::(pairs rest) 
+1

Это OCaml синтаксис, не SML. – sepp2k

Смежные вопросы