具有不可见和可见组件的ML模块,用于删除矩阵的第一列和最后一列。 矩阵存储为列表列表,如下所示:
| 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]];
我需要使用地图功能。
示例运行:
val it = [[5,6],[9,10],[13,14]]:int list list
但我尝试的方式如下:
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 :(得分: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
(没有人会用正确的想法在实际软件中写这个,但看起来不错。)