Использование списков / шаблонов в SML / NJ - PullRequest
1 голос
/ 16 сентября 2011

У меня проблемы с сопоставлением шаблонов со списками в SML.Я пытаюсь создать функцию, которая принимает реальную матрицу 2x2 (определенную как 'a list list) и создает комплекс (real * real).Матрица отформатирована в виде списка списков (составленных с помощью вещественных чисел), причем каждый список представляет собой строку.Я знаю, что должен соответствовать шаблону, но я не уверен, как реализовать свое понимание в реальном коде.Пока мой код:

fun fromMatrix ((a::M):real matrix) : complex =  (hd a, tl M);

Я получаю эту ошибку:

stdIn:1.5-13.32 Error: right-hand-side of clause doesn't agree with function result type [tycon mismatch]
  expression:  real * real list list
  result type:  complex
  in declaration:
    fromMatrix =
      (fn <pat> :: <pat> : real matrix => (hd <exp>,tl <exp>): complex)

1 Ответ

4 голосов
/ 16 сентября 2011

Хорошо, так что если (a::M) имеет тип real matrix (или real list list), то это означает, что a (голова) имеет тип real list, а M (хвост) имеет тип real list list.Тогда hd a имеет тип real, а tl M имеет тип real list list.Таким образом, объединяя их, (hd a, tl M) имеет тип real * real list list, вероятно, не тот, который вам нужен.

Вы, вероятно, хотите понять, что для списков x :: y означает, что x является первым элементом, а y - остальная часть списка (не второй элемент), который является списком.Аналогично, функция hd возвращает первый элемент списка, а функция tl возвращает остальную часть списка.Если вы хотите извлечь первые два элемента, вы можете использовать шаблон x :: y :: z (где z - остальная часть списка после первых двух элементов).Если вы знаете, что это будет двухэлементный список, вы можете указать x :: y :: [] или, что то же самое, [x, y].Вы можете вкладывать шаблоны, поэтому, если у вас есть двухэлементный список из двухэлементных списков, вы можете напрямую сопоставить [[a, b], [c, d]].Однако использование списка фиксированного размера является признаком плохого дизайна.Вы, вероятно, хотите использовать кортеж вместо этого.

...