如何正确阅读这个使用 foldl 的 SML 函数?
How to proper read this SML function that uses 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
我没看到的是 arr
如何从我的 mat
中选择并在闭包函数中使用。
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
意思是,它在 a
的第 0 行(在您的情况下 mat
)调用 f
(在您的情况下 print_arr
),然后在第一行,然后在 2 号,直到有更多行。当没有更多行时,return ()
。与此同时,您没有做任何多余的事情,例如积累一些价值,因为无论如何,您 return 永远是 ()
。
不知道你有没有看到Array2存在。对于矩阵来说应该是非常理想的。
关于折叠的理解,参见ML for the Working Programmer, ch. 5: Functions and infinite data。
我建议您先了解列表上下文中的折叠。
这也是学习中最好涵盖的内容material。
我是 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
有没有,可以看看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
意思是,它在 a
的第 0 行(在您的情况下 mat
)调用 f
(在您的情况下 print_arr
),然后在第一行,然后在 2 号,直到有更多行。当没有更多行时,return ()
。与此同时,您没有做任何多余的事情,例如积累一些价值,因为无论如何,您 return 永远是 ()
。
不知道你有没有看到Array2存在。对于矩阵来说应该是非常理想的。
关于折叠的理解,参见ML for the Working Programmer, ch. 5: Functions and infinite data。
我建议您先了解列表上下文中的折叠。
这也是学习中最好涵盖的内容material。