0

我是 SML 的新手,我无法理解什么是参数以及在此代码中传递给内部函数的内容。

fun print_mat mat =                                                              
  let                                                                            
    val _ = (Array.foldl (                                                       
        fn (arr, _) =>                                                           
          let val _ = (print_arr arr) in () end                                  
    ) () mat)                                                                    
  in () end;  

这意味着用于:

val mat = 
  Array.fromList[                                                                
                 (Array.fromList [0, 1, 1, 0, 1]),                              
                 (Array.fromList [1, 0, 1, 0, 0])                             
                ]

val _ print_mat mat

我没有看到的是如何arr从我的选择中选择mat并在闭包函数中使用。

4

1 回答 1

2

foldl不仅仅适用fn (arr, _) => ...于每个元素。它累积一个结果,在您的情况下,该结果与通配符模式一起被丢弃_,以支持单位值,()。因此,正如 Andreas Rossberg 指出的那样,您实际上并没有积累任何东西,甚至没有产生任何结果值,因此Array.app更适合。

了解什么

fun print_mat mat = Array.app print_arr mat

确实,你可以看看它的实现

fun app f a =
    let val a = from_array a
    val stop = length_ a
    fun lr j = if j < stop then (f(sub_ a j); lr (j+1))
           else ()
    in lr 0 end

意思是,它在(在你的情况下)的第 0 行调用f(在你的情况下),然后在第一行,然后在第二行,直到有更多行。当没有更多行时,返回。与此同时,你没有做任何多余的事情,比如积累一些价值,因为无论如何做完后你总会回来。print_arramat()()

我想知道您是否已经看到Array2存在。它应该非常适合矩阵。

至于理解折叠,请参阅ML for the Working Programmer,ch。5:函数和无限数据

我建议您首先了解列表上下文中的折叠。

这也是学习材料中最好的内容。

于 2019-03-11T12:38:11.140 回答