题
我使用惰性列表的实现,其中类型可以是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
解决方案
你会踢自己...其中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
其他提示
在第一线,你想对阵SEQ1,但这个值是未绑定的意义,它是无处可寻。
这是完全一样:
# let t =
match t1 with
_ -> ();;
Error: Unbound value t1
您必须命名你的论点。
有关更新后的问题,其原因的类型是'a Sequence.t Sequence.t
是因为该行的
Cons ((Nil, value2), ...)
回想一下,Nil
是序列本身,因此通过将有它迫使输入序列中的所有元素是序列太
当你提到尚未定义的名称(技术上“结合到一个出现此错误 值”)。如果您没有正确输入名称可能发生这种情况。
不隶属于 StackOverflow