Несоответствие области видимости между "типом ... и" и "пусть ... и" в Ocaml - PullRequest
3 голосов
/ 17 июля 2011

Интересно, почему в Ocaml «let .. and ...» не имеет такой же видимости, как «type ... and ...»:

Следующее в порядке, t2 в том же объеме, что и t1

# type t1 = t2 
and t2 = int;;

Этот следующий НЕПРАВИЛЬНО, v2 в НЕ в области видимости

# let v1 = v2
and v2 = 3;;

  Characters 9-11:
  let v1 = v2
           ^^

Error: Unbound value v2

Даже "let rec" не работает ...

# let rec v1 = v2
and v2 = 3;;

  Characters 13-15:
  let rec v1 = v2
               ^^
Error: This kind of expression is not allowed as right-hand side of `let rec'

Почему это несоответствие области видимости между "типом ... и" и "пусть ... и"? Спасибо.

1 Ответ

9 голосов
/ 17 июля 2011

Типы неявно рекурсивные. Если вы хотите получить тот же эффект с «let», используйте «let rec .. and».

На идеальном языке обязательные формы, в которых это имеет смысл, должны иметь две версии: одну рекурсивную и одну нерекурсивную. Это относится к let в Caml, у вас есть let и let rec. Нет доступной формы нерекурсивного связывания типов; это не должно быть по умолчанию, даже type nonrec ... подойдет. Это дефект синтаксиса Caml; плохие последствия невозможности определения нерекурсивного типа приведены в этом сообщении в этом сообщении , например.

Что касается вашего второго примера, речь идет не об определении объема, а о достоверности некоторых рекурсивных определений, а не других. Это полностью ортогональная проблема (см. Руководство ocaml , для которого действительны рекурсивные определения), и let rec делает именно то, что вы хотите здесь, в плане охвата.

...