Хорошо, так что если (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]]
.Однако использование списка фиксированного размера является признаком плохого дизайна.Вы, вероятно, хотите использовать кортеж вместо этого.