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

如何正确读取使用foldl的SML函数?,sml,smlnj,mlton,Sml,Smlnj,Mlton,我是SML新手,我很难理解什么是参数,以及在这段代码中传递给内部函数的是什么 fun print_mat mat = let val _ = (Array.foldl (

我是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

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

foldl
做的不仅仅是将
fn(arr,))=>…
应用于每个元素。它累加一个结果,在您的情况下,该结果将与通配符模式一起被丢弃,
,取而代之的是单位值,
()
。所以,正如Andreas Rossberg指出的,实际上你并没有积累任何东西,甚至没有生成任何结果值,所以
Array.app
更适合

了解什么

fun print_mat mat = Array.app print_arr mat
如果有,您可以查看:

fun应用程序f a=
设val a=来自数组a
val停止=长度_uA
fun lr j=如果j<停止然后(f(sub_aj);lr(j+1))
else()
在lr 0端
也就是说,它在
a
的第0行调用
f
(在您的情况下是
print\u arr
)(在您的情况下是
mat
),然后在第一行调用,然后在第二行调用,直到有更多行。当没有更多行时,返回
()
。同时,您没有做过任何多余的事情,比如积累一些值,因为不管怎样,完成后返回的总是
()

我想知道你是否见过这种情况的存在。对于矩阵来说,它应该是非常理想的

如需了解折叠,请参阅

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


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

foldl
做的不仅仅是将
fn(arr,)=>…
应用于每个元素。它累加一个结果,在您的情况下,该结果将与通配符模式一起被丢弃,
,取而代之的是单位值,
()
。所以,正如Andreas Rossberg指出的,实际上你并没有积累任何东西,甚至没有生成任何结果值,所以
Array.app
更适合

了解什么

fun print_mat mat = Array.app print_arr mat
如果有,您可以查看:

fun应用程序f a=
设val a=来自数组a
val停止=长度_uA
fun lr j=如果j<停止然后(f(sub_aj);lr(j+1))
else()
在lr 0端
也就是说,它在
a
的第0行调用
f
(在您的情况下是
print\u arr
)(在您的情况下是
mat
),然后在第一行调用,然后在第二行调用,直到有更多行。当没有更多行时,返回
()
。同时,您没有做过任何多余的事情,比如积累一些值,因为不管怎样,完成后返回的总是
()

我想知道你是否见过这种情况的存在。对于矩阵来说,它应该是非常理想的

如需了解折叠,请参阅

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


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

您了解foldl的功能吗?它将函数(
fn(arr,)=>…
应用于数组数据结构的每个元素。此代码过于复杂。您应该能够将其缩短为
fun print\u mat mat=Array.foldl(fn(arr,)=>print\u arr)()mat
,这可能会使它更容易阅读。或者实际上只是
fun print\u mat mat=Array.app print\u arr mat
,因为这里不需要折叠。您了解
foldl
的功能吗?它应用了函数=>…到数组数据结构的每个元素。此代码过于复杂。您应该能够将其缩短为
fun print\u mat mat=Array.foldl(fn(arr,=>print\u arr)()mat
,这可能会使阅读更容易。或者实际上只是
有趣的print\u mat mat=Array.app print\u arr mat
,因为这里不需要折叠。谢谢您的回答。我不知道
的类型()
。我也很感谢这些链接。在这里,我的
fn
不会返回任何内容,因此我最好使用
Array.app
,因为我没有进行任何折叠。关于
(Array.foldl(fn)()mat)
从实现中,现在我了解到它需要3个参数。为了将来参考,我传递了第二个参数
()
-必须匹配
fn
的返回类型,它是将折叠函数
fn
应用于
数组
数据结构的每个元素后聚合的值。是的,没错。干得好!谢谢你的回答。我不知道
的类型()
。我也很感谢这些链接。在这里,我的
fn
不会返回任何内容,因此我最好使用
Array.app
,因为我没有进行任何折叠。关于
(Array.foldl(fn)()mat)
从实现中,现在我了解到它需要3个参数。为了将来参考,我传递了第二个参数
()
-必须匹配
fn
的返回类型,它是将折叠函数
fn
应用于
数组
数据结构的每个元素后聚合的值。是的,没错。干得好!