Ошибка функции 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 в конце строки с несколькими Nils:

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
Другие вопросы по тегам