Functional programming 在SML中优雅打印二维阵列

Functional programming 在SML中优雅打印二维阵列,functional-programming,sml,fold,Functional Programming,Sml,Fold,我在学习一些SML/NJ,我对自己提出了以下问题: 给定一个Array2网格,每个单元格和每行末尾都包含字符串a\n找到一种优雅打印数组的方法(使用折叠和类似的东西) 我的尝试失败了 print (Array2.fold Array2.RowMajor (op ^) "" grid) 它以正确的顺序打印所有行,但每行都是颠倒的 val arr = Array2.fromList [["1", "2", "\n"], ["3", "4", "\n"]]; fun myConcat (x, an

我在学习一些SML/NJ,我对自己提出了以下问题:

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

我的尝试失败了

 print (Array2.fold Array2.RowMajor (op ^) "" grid)
它以正确的顺序打印所有行,但每行都是颠倒的

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
如果这是一个列表,那么它将支持
foldl
foldr
函数,因此整个过程将非常简单

传统的打印方式是

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