2016-12-30 5 views
0

Модуль ML с невидимыми и видимыми компонентами для удаления первого и последнего столбцов матрицы. Матрица хранится в виде списка списков, как показано ниже:sml-карта и структура с использованием рекурсии

| 4 | 5 | 6 | 7 | | 8 | 9 | 10 | 11 | | 12 | 13 | 14 | 15 | => представляет собой массив 4x4

. Вышеуказанная матрица будет храниться как val mat = [[4,5,6,7], [8,9,10,11], [12,13,14,15] ];

Мне нужна карта использования функция.

Образец Пробег:

  • вал мат = [[4,5,6,7], [8,9,10,11], [12,13,14,15]];
  • S.reduce (mat);

вал это = [[5,6], [9,10], [13,14]]: INT список список


Но я стараюсь по-другому, как:

fun reduce(x,y,z,t)=(y,z); 
val mat = [(4,5,6,7),(8,9,10,11),(12,13,14,15)]; 
map reduce(mat); 

Выход:

- val reduce = fn : 'a * 'b * 'c * 'd -> 'b * 'c                                 
val mat = [(4,5,6,7),(8,9,10,11),(12,13,14,15)] : (int * int * int * int) list                          
val it = [(5,6),(9,10),(13,14)] : (int * int) list 

Как найти правильный ответ?

+0

списки могут иметь любую длину, но кортежи имеют фиксированную длину: если вы определяете функцию для обработки 4-х кортежей типа (a, b , c, d), он не может иметь дело с другими кортежами, такими как (a, b, c) или (a, b, c, d, e, f, g). Поэтому вам нужно работать со списками здесь, а не с кортежами. Используйте сопоставление шаблонов. –

ответ

2

Это проще, если вы сначала удалите с одного конца, а затем другого.

Снятие первой колонны легко; это просто применяя List.tl к каждой строке:

- val mat=[[4,5,6,7],[8,9,10,11],[12,13,14,15]]; 
val mat = [[4,5,6,7],[8,9,10,11],[12,13,14,15]] : int list list 
- map tl mat; 
val it = [[5,6,7],[9,10,11],[13,14,15]] : int list list 

Там нет библиотечной функции, которая возвращает все элементы, кроме последнего, но это достаточно просто написать:

fun except_last [] = [] 
    | except_last [x] = [] 
    | except_last (x::xs) = x :: (except_last xs); 

(случай для пустого списка остается под вопросом , вы, вероятно, хотите, чтобы рассматривать это как ошибку Это достаточно хорошо для целей иллюстрации, хотя ...)

- map except_last mat; 
val it = [[4,5,6],[8,9,10],[12,13,14]] : int list list 

а потом объединить два функц. ионы:

- fun reduce_row xs = except_last (tl xs); 
val reduce_row = fn : 'a list -> 'a list 
- fun reduce m = map reduce_row m; 
val reduce = fn : 'a list list -> 'a list list 
- reduce mat; 
val it = [[5,6],[9,10],[13,14]] : int list list 

Альтернативная реализация, что довольно неэффективно, но приятно симметричным, чтобы удалить последний столбец в обратном строку, удалив первый элемент, а затем изменяет его обратно:

- map (tl o rev o tl o rev) mat; 
val it = [[5,6],[9,10],[13,14]] : int list list 

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