递归let绑定的非轻量语法是什么?

时间:2011-06-28 03:59:40

标签: f#

我检查了相关的spec section,并猜了几次尝试,但无法弄清楚。我如何表达,例如,以下光语法递归让使用非光语法绑定(在单行上)?

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 个答案:

答案 0 :(得分:3)

与@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"

答案 1 :(得分:0)

你得到的很好,但你还没有完成......表格是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)