Что такое нелегкий синтаксис для рекурсивных привязок let? - PullRequest
3 голосов
/ 28 июня 2011

Я проверил соответствующий раздел спецификации и угадал несколько попыток, но не смог разобраться. Как я могу выразить, например, следующий легкий синтаксис с рекурсивной привязкой let с использованием нелегкого синтаксиса (в одну строку)?

let rec f x = g x 
and g x = f x

(let rec f x = g x and g x = f x дает мне «Неожиданное ключевое слово» и «в связывании. Ожидаемая неполная структурированная конструкция в или до этой точки или другого токена.», Если я не отключу легкий синтаксис, как предложил @Ramon Snir, но, конечно, есть способ сделать это, когда включен легкий синтаксис?)

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

То же объявление, которое предлагает @kvb, должно работать и на верхнем уровне:

#light "off"

module Foo = begin
  let rec f a = g (a + 1)
  and g a = f (a + 1)
end

Может быть, компилятор смущен каким-то другим кодом, который следует вашим объявлениям?

РЕДАКТИРОВАТЬ: О, проблема немного в другом - вы хотели написать рекурсивное объявление в одной строке в режиме #light. Я не мог найти никакого способа сделать это, и я думаю, что это может быть невозможно в режиме #light. На практике вы всегда можете написать многострочное объявление (даже в каком-то странном контексте):

if true && (let rec f x = g x
            and g x = f x in f) 0 then 
    printfn "funny"
0 голосов
/ 28 июня 2011

То, что у вас есть, хорошо, но вы еще не закончили ... Форма - let rec [bindings] in [expr]. Вы написали привязки, но нет тела. Вам просто нужно добавить in и затем выражение, в котором вы хотите применить привязки. Например:

#light "off"

let rec even x =
    if x = 0 then true
    else odd (x-1)
and odd x =
    if x = 0 then false
    else even (x-1)
in
    printfn "%b" (even 20)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...