打印 Array2 二维字符数组

Print Array2 2D char array

我正在尝试在 SML 中打印一个二维字符数组,其形式为:

val arr = Array2.fromList [[#"a", #"b", #"c"], [#"d", #"e", #"f"], [#"g", #"h", #"i"]];

请注意,每行的最后一个元素 不是 一个 #"\n" 元素。

结果必须采用以下形式,其中每一行都用新行表示:

abc
def
ghi

在 SML 中有什么方法可以做到这一点吗?

你可以写一个函数如下:

fun print_arr (arr,N,col) = ()
| print_arr(arr,row,M) = (print("\n");print_arr(arr,row+1,0))
| print_arr(arr,row,col) = (print(Array.sub(arr,row,col)); print_arr(arr,row,col+1))

注意N,M分别是行数和列数。在这里你递归地打印每个元素。当你到达一行的末尾时,你打印一个新行,然后你调用该函数并将下一行作为参数。你的初始参数应该是 (arr,0,0).

您可以使用 Array2.row, Array2.nRows and CharVector.tabulate:

一次迭代并打印一整行
Array2.row   : 'a array * int -> 'a Vector.vector
Array2.nRows : 'a array -> int
CharVector.tabulate : int * (int -> char) -> string

您可以定义一个函数 app_row,它接受一个 Array2.array 并在每一行上调用一个函数 f,提取为一个向量。一个函数 vec_to_str 接受该向量 vec 并将其转换为 字符串 ;然后打印出来。

fun app_row f arr =
    let fun loop i = if i = Array2.nRows arr then ()
                     else (f (Array2.row (arr, i)); loop (i+1))
    in loop 0 end

fun vec_to_str vec =
    CharVector.tabulate (Vector.length vec, fn i => Vector.sub (vec, i))

fun showMatrix arr =
    app_row (fn row => print (vec_to_str row ^ "\n")) arr

试穿尺码:

- showMatrix arr;
abc
def
ghi
> val it = () : unit

此解决方案的强度 I/O 应该低于例如使用 Array2.appi 并一次打印每个字母。它也稍微复杂一些,因为它涉及将“char Vector.vector”转换为“CharVector.vector”(又名一个 字符串 )。 (两者之间的区别很微妙。)

仍然是一个类似于 P. Antoniadis 解决方案的替代解决方案,但您不需要指定尺寸(因为它们可以使用 Array2.nColsArray2.nRows 等方法提取) :

fun showMatrix arr =
    Array2.appi Array2.RowMajor (fn (_, col, c) =>
      print (str c ^ (if col + 1 = Array2.nCols arr then "\n" else "" )))
      {base=arr,row=0,col=0,nrows=NONE,ncols=NONE}