【问题标题】:Print Array2 2D char array打印 Array2 二维字符数组
【发布时间】:2018-09-29 04:22:07
【问题描述】:

我正在尝试在 SML 中打印一个 2D 字符数组,其形式为:

val arr = Array2.fromList [[#"a", #"b", #"c"], [#"d", #"e", #"f"], [#"g", #"h", #"i"]];

请注意,每行中的最后一个元素不是#"\n" 元素。

结果必须采用以下形式,其中每一行都以新行表示:

abc
def
ghi

有没有办法在 SML 中做到这一点?

【问题讨论】:

    标签: arrays functional-programming sml smlnj ml


    【解决方案1】:

    您可以使用Array2.row, Array2.nRowsCharVector.tabulate 一次迭代并打印一整行:

    Array2.row   : 'a array * int -> 'a Vector.vector
    Array2.nRows : 'a array -> int
    CharVector.tabulate : int * (int -> char) -> string
    

    您可以定义一个函数app_row,它接受一个Array2.array,并在每一行上调用一个函数f,提取为一个向量。还有一个函数vec_to_str 接受向量vec 并将其转换为字符串;然后打印出来。

    fun app_row f arr =
        let fun loop i = if i = Array2.nRows arr then ()
                         else (f (Array2.row (arr, i)); loop (i+1))
        in loop 0 end
    
    fun vec_to_str vec =
        CharVector.tabulate (Vector.length vec, fn i => Vector.sub (vec, i))
    
    fun showMatrix arr =
        app_row (fn row => print (vec_to_str row ^ "\n")) arr
    

    试试这个尺寸:

    - showMatrix arr;
    abc
    def
    ghi
    > val it = () : unit
    

    此解决方案的 I/O 密集度应低于例如使用Array2.appi 并一次打印每个字母。它也稍微复杂一些,因为它涉及将“char Vector.vector”转换为“CharVector.vector”(又名string)。 (两者的区别很微妙。)

    仍然是类似于 P. Antoniadis 解决方案的替代解决方案,但您不需要指定尺寸(因为可以使用例如 Array2.nColsArray2.nRows 提取它们):

    fun showMatrix arr =
        Array2.appi Array2.RowMajor (fn (_, col, c) =>
          print (str c ^ (if col + 1 = Array2.nCols arr then "\n" else "" )))
          {base=arr,row=0,col=0,nrows=NONE,ncols=NONE}
    

    【讨论】:

      【解决方案2】:

      你可以写一个函数如下:

      fun print_arr (arr,N,col) = ()
      | print_arr(arr,row,M) = (print("\n");print_arr(arr,row+1,0))
      | print_arr(arr,row,col) = (print(Array.sub(arr,row,col)); print_arr(arr,row,col+1))
      

      注意 N,M 分别是行数和列数。在这里,您递归地打印每个元素。当您到达一行的末尾时,您打印一个新行,然后,您调用该函数并将下一行作为参数。您的初始参数应该是 (arr,0,0)。

      【讨论】:

      • 感谢您的回答,但代码有一些问题。 #1:我使用的是 Array2 结构,因此我将 Array.sub 替换为 Array2.sub #2:即使进行了更改,我也会收到错误:Error: match redundant (arr,N,col) => ... --> (arr,row,M) => ... --> (arr,row,col) => ... #3:该数组是 char 数组而不是 sting 数组。因此,除非有一种简单的方法可以转换为字符串,否则 print 将不起作用。
      • 您可以使用 Char.toString() 将 char 转换为字符串。您是否在程序中定义了 N 和 M?
      • 感谢您的回答!如果我指定 N 和 M,它会起作用,但 Simon Shine 的答案更好。因为它在函数内部计算 N 和 M。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 2017-12-29
      • 2019-10-24
      • 2014-12-21
      • 2015-12-13
      • 1970-01-01
      相关资源
      最近更新 更多