在 SML 中优雅地打印二维数组

Elegantly printing 2d array in SML

我正在研究一些 SML/NJ 并且我对自己提出了以下问题:

给定一个 Array2 grid ,它在每个单元格中包含字符串,在每行的末尾 \n 找到一种优雅地打印数组的方法(使用折叠和类似的东西那)

我的尝试是

 print (Array2.fold Array2.RowMajor (op ^) "" grid)

以正确的顺序打印所有行,但每一行都颠倒了。

如果这是一个列表,它将支持 foldlfoldr 函数,因此整个过程将是微不足道的。

而常规的打印方式是

fun printGrid i N M grid =
  if (i >= N) then ()
  else
    (
      let
        fun printRow j M =
          if (j >= M + 1) then ()
          else (print (Array2.sub(grid, i, j)); printRow (j+1) M)
      in
        printRow 0 M;
        printGrid (i + 1) N M grid
      end
    )

当然不是那么优雅!

是否有一种优雅的(单行)方式可以正确打印它?

在您的试用版中,您使用 (op ^),而 fn (x, ans) => x ^ ans。但是,您想要的是 fn (x, ans) => ans ^ x 这样连接的顺序就颠倒了。

val arr = Array2.fromList [["1", "2", "\n"], ["3", "4", "\n"]];
fun myConcat (x, ans) = ans ^ x;
print (Array2.fold Array2.RowMajor myConcat "" arr);
12
34
val it = () : unit