如何正确读取使用foldl的SML函数?
我是SML新手,我很难理解什么是参数,以及在这段代码中传递给内部函数的是什么如何正确读取使用foldl的SML函数?,sml,smlnj,mlton,Sml,Smlnj,Mlton,我是SML新手,我很难理解什么是参数,以及在这段代码中传递给内部函数的是什么 fun print_mat mat = let val _ = (Array.foldl (
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
应用于数组
数据结构的每个元素后聚合的值。是的,没错。干得好!