2016-12-30 270 views
0

帶有不可見和可見組件的ML模塊刪除矩陣的第一列和最後一列。 矩陣存儲爲列表清單,如下所示:sml映射和結構使用遞歸

| 4 | 5 | 6 | 7 | | 8 | 9 | 10 | 11 | | 12 | 13 | 14 | 15 | =>是4×4陣列

上面的矩陣將被存儲爲 val mat = [[4,5,6,7],[8,9,10,11],[12,13,14,15] ]。

我需要使用地圖功能。

樣品試驗:

  • VAL墊= [[4,5,6,7-],[8,9,10,11],[12,13,14,15]];
  • S.reduce(mat);

VAL IT = [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 

(沒有人會在實際的軟件中寫這個,但它看起來不錯)。