惰性 fold_right 定义中的 int 函数错误
int function error in lazy fold_right definition
我正在尝试编写 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
s 相关的内容?我没看到什么?
(Cons
、Nil
和 next
都是为 batLazyList.ml 中的 LazyList
定义的。)
错误来自 Batteries.LazyList
中的 init
函数,它隐藏了局部 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
我正在尝试编写 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
s 相关的内容?我没看到什么?
(Cons
、Nil
和 next
都是为 batLazyList.ml 中的 LazyList
定义的。)
错误来自 Batteries.LazyList
中的 init
函数,它隐藏了局部 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