Ocaml语法错误

时间:2009-10-29 18:46:22

标签: syntax ocaml lazylist

我正在使用惰性列表的实现,其中类型可以是NilCons (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

4 个答案:

答案 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”时)会发生此错误 值”)。如果您输入错误名称,可能会发生这种情况。