【问题标题】:sml map and structure using recursion [closed]使用递归的 sml 映射和结构
【发布时间】:2017-05-15 05:16:04
【问题描述】:

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

如何找到正确答案?

【问题讨论】:

  • 列表可以有任意长度,但元组的长度是固定的:如果你定义一个函数来处理像 (a,b,c,d) 这样的 4 元组,它就无法处理其他元组,如 (a,b,c) 或 (a,b,c,d,e,f,g)。所以你需要在这里使用列表,而不是元组。使用模式匹配。

标签: dictionary recursion sml ml


【解决方案1】:

如果你先删除一端然后另一端,这会更容易。

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

(没有头脑正常的人会在实际软件中写这个,但看起来不错。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2020-09-30
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 2011-12-22
    • 2022-01-24
    相关资源
    最近更新 更多