如何正确阅读这个使用折叠的 SML 函数?



我是 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中选择并在闭包函数中使用。

>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

意思是,它在a的第 0 行(在您的例子中mat)上调用f(在您的例子中是print_arr),然后在第 1 行,然后在第 2 行,直到有更多行。当没有更多行时,返回()。与此同时,你没有做任何多余的事情,比如积累一些价值,因为无论如何

你都会()

回来。我想知道您是否已经看到 Array2 存在。对于矩阵来说,它应该是非常理想的。

至于理解折叠,请参阅工作程序员的ML,第5章:函数和无限数据

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

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

最新更新