在SML中优雅地打印2d数组

时间:2018-04-01 20:09:05

标签: functional-programming sml fold

我正在研究一些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
    )

当然不是那么优雅!

是否有优雅(单线)的方式来正确打印?

1 个答案:

答案 0 :(得分:2)

在您的试用版中,您使用(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