我正在使用惰性列表的实现,其中类型可以是Nil
或Cons (value, thunk)
,其中thunk
是从单元到列表其余部分的函数。
我正在尝试编写一个函数cross
,它将起List.combine
的作用。不幸的是,我有语法错误。
open Sequence;;
let rec (cross : 'a Sequence.t -> 'b Sequence.t -> ('a * 'b) Sequence.t) = match seq1 with
Nil -> match seq2 with
Cons (value2, thunk2) -> Cons ((Nil, value2), function () -> (cross Nil (thunk2 ())))
| Cons (value1, thunk1) -> match seq2 with
Nil -> Cons ((value1, Nil), function() -> (cross Nil (thunk1 ())))
| Cons (value2, thunk2) -> Cons ((value1, value2), function() -> (cross (thunk1 ()) (thunk2 ())))
这会产生错误:
Error: Unbound value seq1
我做错了什么?
更新
此类型检查,但不是我正在寻找的类型。
let rec cross (seq1 : 'a Sequence.t) (seq2 : 'b Sequence.t) : ('a * 'b) Sequence.t = match seq1 with
Nil -> match seq2 with
Cons (value2, thunk2) -> Cons ((Nil, value2), function () -> (cross Nil (thunk2 ())))
| Cons (value1, thunk1) -> match seq2 with
Nil -> Cons ((value1, Nil), function() -> (cross Nil (thunk1 ())))
| Cons (value2, thunk2) -> Cons ((value1, value2), function() -> (cross (thunk1 ()) (thunk2 ())))
val cross :
'a Sequence.t Sequence.t ->
'a Sequence.t Sequence.t -> ('a Sequence.t * 'a Sequence.t) Sequence.t =
<fun>
这不是我想要的十字架类型。我正在寻找:
'a Sequence.t -> 'b Sequence.t -> ('a * 'b) Sequence.t
答案 0 :(得分:4)
你要踢自己...... seq1定义在哪里?
let rec (cross : 'a Sequence.t -> 'b Sequence.t -> ('a * 'b) Sequence.t) =
你定义了十字架的类型,但你没有把变量绑定到任何东西(我想,你可以这么说)。
let rec cross (seq1:'a Sequence.t) (seq2:'a Sequence.t) :('a * 'b) Sequence.t =
编辑:
我认为你的匹配很好,不匹配。在案例周围使用begin ... end
块,我认为发生了什么(因为我没有序列,我无法验证)是你打算用于外部匹配的匹配案例正在应用于内部匹配,匹配SEQ2。例如,
match x with
| 0 -> match y with
| 1 -> "x:0, y:1"
| 2 -> match y with
| 0 -> "y:0, x:2"
虽然在空间上看起来不错,但是第二场比赛match y with
与| 2 -> ...
匹配案例绑定。以下是匹配案例周围being ... end
个关键字的版本。第二次开始......结束是不需要的,但为了清楚起见,最好还是这样做。
match x with
| 0 -> begin match y with
| 1 -> "x:0, y:1" end
| 2 -> begin match y with
| 0 -> "y:0, x:2" end
答案 1 :(得分:2)
在第一行中,您尝试匹配seq1,但此值未绑定意味着它无处可寻。
这与:
完全相同# let t =
match t1 with
_ -> ();;
Error: Unbound value t1
你必须为你的论点命名。
答案 2 :(得分:2)
对于您更新的问题,类型为'a Sequence.t Sequence.t
的原因是由于行
Cons ((Nil, value2), ...)
回想一下,Nil
本身就是一个序列,所以把它放在那里它会强制输入序列的所有元素都是序列。
答案 3 :(得分:0)
当您提到尚未定义的名称(技术上“绑定到a”时)会发生此错误 值”)。如果您输入错误名称,可能会发生这种情况。