我检查了相关的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建议的那样,但肯定有一种方法可以在灯光语法打开时执行此操作吗?)
答案 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)