【问题标题】:Elegantly printing 2d array in SML在 SML 中优雅地打印二维数组
【发布时间】:2018-09-11 03:12:57
【问题描述】:

我正在学习一些 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
    )

这当然不是那么优雅!

是否有一种优雅(单行)的方式来实现正确打印?

【问题讨论】:

    标签: functional-programming sml fold


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多