在 SML 中优雅地打印二维数组
Elegantly printing 2d array in SML
我正在研究一些 SML/NJ 并且我对自己提出了以下问题:
给定一个 Array2
grid
,它在每个单元格中包含字符串,在每行的末尾 \n
找到一种优雅地打印数组的方法(使用折叠和类似的东西那)
我的尝试是
print (Array2.fold Array2.RowMajor (op ^) "" grid)
以正确的顺序打印所有行,但每一行都颠倒了。
如果这是一个列表,它将支持 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
我正在研究一些 SML/NJ 并且我对自己提出了以下问题:
给定一个 Array2
grid
,它在每个单元格中包含字符串,在每行的末尾 \n
找到一种优雅地打印数组的方法(使用折叠和类似的东西那)
我的尝试是
print (Array2.fold Array2.RowMajor (op ^) "" grid)
以正确的顺序打印所有行,但每一行都颠倒了。
如果这是一个列表,它将支持 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