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

ужно использовать методы сопоставления с образцом, чтобы рекурсивно поменять местами каждую пару элементов в списке. Так,[1, 2, 3, 4, 5] вернется[2, 1, 4, 3, 5].

Я нашел две вещи:

List.length: чтобы вернуть длину. Что полезно для работы с четными / нечетными списками.List.nth: для возврата значения в указанное место в списке.drop.(list, i): чтобы вернуть значения после того, как первые элементы i удалены.

Используя эти три вещи, я могу разобраться в некоторых методах рекурсии, но я не понимаю аспект сопоставления с образцом. Ниже приведен псевдокод без сопоставления с образцом.

function(list):
  var a = first on list
  var b = second on list

  // odd case
  if(b = null | "")
  {
    list = drop.(list, 1) @ a
  }

  // even case
  else if(b = "" & a = "")
  {
    list = list
  }

  // recursive case
  else
  {
    list = function(drop.(list, 2) @ b @ a)
  }

По сути, это может начать цикл по списку, обмен парами, размещение (объединение) их в конце списка и рекурсивное повторение этого до тех пор, пока не пройдут все пары.

 John Coleman15 дек. 2017 г., 02:53
Если вы думаете о цикле for, то вы не мыслите функционально и не думаете о сопоставлении с образцом. Конечно, в вашем учебнике есть примеры рекурсивных функций в списках, которые определяются с помощью сопоставления с образцом. Попробуйте подражать таким примерам.
 molbdnilo15 дек. 2017 г., 12:10
Начните с функции сопоставления с образцом - нетnth или жеtake или жеdrop, только шаблоны - это просто возвращает первые два элемента списка. (Подумайте о том, что делать, когда их меньше двух; вам понадобится более одного предложения.) Затем верните их поменять местами. Затем добавьте рекурсию по остальной части списка.
 Simon Shine20 дек. 2017 г., 09:43
Вы на самом деле не задаете вопрос ...
 John Coleman15 дек. 2017 г., 02:46
Звучит как интересная домашняя задача. Как вы собираетесь решить это? Возможно, вы можете поделиться своими усилиями по поиску решения и задать более сфокусированный вопрос.

Ответы на вопрос(1)

Решение Вопроса

ФункцииList.length, List.nth а такжеList.drop кажется, что они могут решить вашу задачу, но это противоречит вашей цели использования сопоставления с образцом. При сопоставлении с образцом вы используете, что списки - это алгебраические типы данных, объявленные вроде

datatype 'a list = [] | :: of 'a * 'a list

который производит конструкторы значений[] для пустого списка и инфикса:: оператор дляминусыэлемент перед существующим списком (который либо пуст, либо создан таким же образом), но такжеконструкторы шаблонов за признание того, с каким списком вы имеете дело.

Пример: Функция, которая берет список целых чисел и суммирует их:

fun sum [] = 0
  | sum (x::xs) = x + sum xs

Пример: Функция, которая принимает список из 2-х кортежей и возвращает аналогичный список из 2-х кортежей, но с заменой элементов в каждом 2-кортеже:

fun swap [] = []
  | swap ((x,y)::xys) = (y,x)::swap xys

Пример: Функция, которая принимает список целых чисел четного размера и возвращает список, в котором они были добавлены парами:

fun addpairs (x::y::xys) = x + y :: addpairs xys
  | addpairs [_x] = raise Fail "Odd-sized list"
  | addpairs [] = []

В частности, шаблоны могут быть вложенными ((x,y)::xys ~~ "список по крайней мере с одним элементом, где первый элемент представляет собой 2-кортеж, первая часть которого называетсяx а вторая часть называетсяy" а такжеx::y::xys ~~ "список, содержащий как минимум два элемента с первым именемx и второй элемент с именемy"), и порядок (сопоставление сверху вниз) может иметь значение, если шаблоны перекрываются (чего нет в любом из вышеперечисленных)

Ваш ответ на вопрос