Functional programming 在SML中优雅打印二维阵列
我在学习一些SML/NJ,我对自己提出了以下问题: 给定一个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
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