2015-03-05 2 views
-3

Я работаю над программой обнаружения движения OCaml. Он анализирует два изображения и обнаруживает, было ли движение. Одна часть требует, чтобы я суммировал ряд значений, а затем суммировал целое изображение. Это то, что у меня есть currenly:OCaml: Переход от списка списка int к int

let rec sumImRow(maskedrow) = 
match maskedrow with 
    | [] -> 0 
    | mskRhd::mskRtl -> mskRhd + (sumImRow mskRtl) 
    ;; 

let rec sumImage(maskedimage) = 
match maskedimage with 
    | mskRhd::mskRtl -> (sumImRow mskRhd)::(sumImage mskRtl) 
    | _ -> [] 
    ;; 

и данное значение int list list -> int list = <fun>. Я не совсем понимаю, почему это дает мне int list.

ответ

1

ТЛ; дг: Вы построить новый список вместо суммирования чисел.

Ну, мы можем согласиться с тем, что sumImRow имеет тип int list -> int, так как он принимает элементы из списка, а затем возвращает их сумму.

sumImage будет иметь аргумент list, поскольку он деконструирует его в соответствии с шаблоном. Затем он возвращает list результата sumImRow, то есть sumImage получает в качестве аргумента список того, что sumImRow берет и возвращает список результатов. Таким образом, у нас действительно есть int list list -> int list.

Вы можете избежать этого, заменив :: с + и [] с 0 в согласующем результате sumImage «s.

Вы можете также сделать более усовершенствованный код с помощью List.fold_left:

let sumImRow l = List.fold_left (+) 0 l;; 
let sumImage l = List.fold_left (List.fold_left (+)) 0 l;; 
0

Два возвращаемых значения: sumImage - оба этих списка. Поэтому, естественно, его тип возврата - это список.

(Скорее всего, вы должны использовать +, а не :: в sumImage И базовый случай должен быть 0, а не [].).

Смежные вопросы