foldl
делает нечто большее, чем применяет fn (arr, _) => ...
к каждому элементу. накапливает результат, который в вашем случае отбрасывается с шаблоном подстановки, _
, в пользу значения единицы, ()
.Итак, как указывает Андреас Россберг, вы на самом деле ничего не накапливаете и даже не генерируете какое-либо значение результата, поэтому 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
Это означает, что он вызывает f
(в вашем случае print_arr
) в 0-й строке a
(в вашем случаеmat
), затем в 1-й строке, затем во 2-й строке, пока не появится больше строк.Если строк больше нет, верните ()
.Тем временем вы не сделали ничего лишнего, например, накопили какое-то значение, так как всегда будет ()
, что вы все равно вернете, когда все закончите.
Интересно, видели ли вы, что Array2 существует.Это должно быть идеально для матриц.
Что касается понимания сворачивания, см. ML для Работающего Программиста, гл.5: Функции и бесконечные данные .
Я рекомендую сначала разбираться в свертывании в контексте списка.
Это также лучше всего освещается в учебных материалах.