如何正确阅读使用foldl的SML函数?

时间:2019-03-08 23:11:21

标签: sml smlnj mlton

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

1 个答案:

答案 0 :(得分:2)

foldl除了将fn (arr, _) => ...应用于每个元素外,还可以做其他事情。它会累加结果,在您的情况下,该结果将以通配符模式_丢弃,取而代之的是单位值()。因此,正如Andreas Rossberg指出的那样,您实际上并没有累加任何东西,甚至没有产生任何结果值,因此Array.app更适合。

了解什么

fun print_mat mat = Array.app print_arr mat

可以,您可以查看its implementation

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

意思是,它在f的第0行(在您的情况为print_arr)中调用a(在您的情况下为mat),然后在第一行,然后在第二天,直到有更多的行。如果没有更多的行,则返回()。同时,您没有做任何多余的事情,例如积累了一些价值,因为无论如何,返回总是()

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

有关理解折叠的信息,请参见ML for the Working Programmer, ch. 5: Functions and infinite data

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

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