Синтаксическая ошибка Ocaml - PullRequest
2 голосов
/ 29 октября 2009

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

Ответы [ 4 ]

4 голосов
/ 29 октября 2009

ты собираешься пнуть себя ... где определен 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 =

EDIT:

Я думаю, что ваше соответствие хорошо, не соответствует. Использование begin ... end блоков вокруг случаев, я думаю, что происходит (и поскольку у меня нет Sequence, я не могу проверить), что случаи соответствия, которые вы намереваетесь для внешнего соответствия, применяются к внутреннему, соответствуя 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
2 голосов
/ 29 октября 2009

Для вашего обновленного вопроса, причина типа 'a Sequence.t Sequence.t из-за строки

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

Напомним, что Nil является самой последовательностью, поэтому, помещая ее туда, она заставляет все элементы входных последовательностей быть последовательностями.

2 голосов
/ 29 октября 2009

в первой строке вы пытаетесь сопоставить с seq1, но это значение является несвязанным, что означает, что его нигде не найти.

Это точно так же, как:

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

Вы должны назвать свои аргументы.

0 голосов
/ 27 июля 2015

Эта ошибка возникает, когда вы упомянули имя, которое не было определено (технически «связано с значение"). Это может произойти, если вы неправильно набрали имя.

...