Я использую реализацию отложенных списков, где типом может быть либо 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
что я делаю не так?
UPDATE:
Этот тип проверяет, но это не тот тип, который я ищу.
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