Я использую реализацию ленивых списков, где типом может быть 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