Как правильно читать эту функцию SML, которая использует foldl? - PullRequest
0 голосов
/ 09 марта 2019

Я новичок в 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 Ответ

2 голосов
/ 11 марта 2019

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: Функции и бесконечные данные .

Я рекомендую сначала разбираться в свертывании в контексте списка.

Это также лучше всего освещается в учебных материалах.

...