SML图和结构使用递归



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 mat = [[4,5,6,7],[8,9,10,11],[12,13,14,15];
  • S.Reduce(Mat);

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

如何找到正确的答案?

如果先在一端删除,然后再删除另一端。

删除第一列很容易;它只是将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

(在他们的右脑中没有人会在实际软件中写这本书,但看起来不错。)

最新更新