Ошибка функции int в определении lazy fold_right
Я пытаюсь написать модифицированную версию Batteries.LazyList.lazy_fold_right
, Мне нужна похожая функция, которая складывается в два ленивых списка, а не в один ленивый список. Однако я получаю ошибку, которая не имеет никакого смысла для меня.
Вот оригинальное определение батареи, с которого я начал, в batLazyList.ml:
let lazy_fold_right f l init =
let rec aux rest = lazy begin
match next rest with
| Cons (x, t) -> f x (aux t)
| Nil -> Lazy.force init
end in
aux l
Вот моя версия:
let lazy_fold_right2 f l1 l2 init =
let open Batteries.LazyList in
let rec aux rest1 rest2 =
lazy begin
match next rest1, next rest2 with
| Cons (x1, t1), Cons (x2, t2) -> f x1 x2 (aux t1 t2)
| Nil, Nil | Nil, _ | _, Nil -> Lazy.force init
end
in
aux l1 l2
Ошибка в переменной init
в конце строки с несколькими Nil
s:
Error: This expression has type int -> (int -> 'a) -> 'a t but an expression was expected of type 'b lazy_t
А? Где есть что-нибудь, связанное с int
в коде? Что я не вижу?
(Cons
, Nil
, а также next
все определены для LazyList
в batLazyList.ml.)
1 ответ
Ошибка исходит от init
функция в Batteries.LazyList
это затмевает местное init
переменная. Существует две возможности избежать этой проблемы: либо активировать предупреждение 44 (для теневых локальных идентификаторов), либо определить короткий псевдоним для Batteries.LazyList
а не местный открытый:
let lazy_fold_right2 f l1 l2 init =
let module L = Batteries.LazyList in
let rec aux rest1 rest2 =
lazy begin
match L.next rest1, L.next rest2 with
| L.Cons (x1, t1), Cons (x2, t2) -> f x1 x2 (aux t1 t2)
| Nil, Nil | Nil, _ | _, Nil -> Lazy.force init
end
in
aux l1 l2