使用递归的sml映射和结构

时间:2016-12-30 23:46:45

标签: dictionary recursion sml ml

具有不可见和可见组件的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(垫);

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

如何找到正确答案?

1 个答案:

答案 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

(没有人会用正确的想法在实际软件中写这个,但看起来不错。)