2

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

4 回答 4

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匹配案例关键字的版本。第二个 begin ... 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
于 2009-10-29T19:04:06.343 回答
2

在第一行中,您尝试与 seq1 匹配,但该值是未绑定的,这意味着它无处可寻。

这与:

# let t =
  match t1 with
  _ -> ();;
Error: Unbound value t1

你必须命名你的论点。

于 2009-10-29T19:04:37.013 回答
2

对于您更新的问题,类型的原因'a Sequence.t Sequence.t是因为该行

Cons ((Nil, value2), ...)

回想一下,Nil它本身就是一个序列,所以通过把它放在那里,它会强制输入序列的所有元素也成为序列。

于 2009-10-29T20:39:39.817 回答
0

当您提到尚未定义的名称(技术上“绑定到值”)时,会发生此错误。如果您输入了错误的名称,则可能会发生这种情况。

于 2015-07-27T17:59:38.663 回答