【问题标题】:What is the non-light syntax for recursive let bindings?递归 let 绑定的非轻量级语法是什么?
【发布时间】:2011-09-23 23:43:56
【问题描述】:

我查看了相关的spec section 并猜测了一些尝试,但无法弄清楚。例如,如何使用非轻型语法(在单行上)表达以下轻型语法递归 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 的建议关闭轻量级语法,但肯定有一种在轻量语法打开时执行此操作的方法?)

【问题讨论】:

  • 这工作正常。 FSI 处理 let rec f x = g x and g x = f x 很好(在 #light "off" 之后)并正确编译。
  • @Karl Knechtel - 更新了我的主要尝试(其他仅包括抛出 inbeginend 和括号。
  • @Ramon Snir - 非常有趣,如果在轻语法打开时没有办法做到这一点,我会感到惊讶。
  • 这是 F# 中长期存在的错误,恕我直言。
  • 以同样的方式“让 a = 2 让 b = 3”会给你一个解析错误,除非你关闭轻语法。轻量级的语法有时会迫使您进行换行。正如乔恩所说,这个“问题”并不新鲜,我认为没有解决方法(除了插入换行符......毕竟这可能是一件好事)。

标签: f#


【解决方案1】:

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

【讨论】:

  • 感谢@kvb,但在这里省略正文不是我的问题,因为我正在查看顶级绑定(我应该提到这一点)。我想做的是将我给出的示例表达式写在一行上,我认为有一种特殊的非轻量级语法,但到目前为止我所看到的是你可以在一行中完成它任何额外的语法,但您必须明确“关闭”轻量级语法。这让我感到惊讶,因为根据我的经验,直到现在所有非轻型语法都是有效的,即使在轻型语法打开时也是如此。 (抱歉,这里有很多“开”和“关”,可能很难理解)。
  • 不完全是你要找的东西,但我敢打赌 let f,g=let rec f x=g x and g x=f x in f,g 有效。
  • (其实这个例子中可能是一个值限制。我AFK所以现在不能自己尝试。)
  • @Brian - 与#light "off" 一起工作正常,但与#light "on" 不兼容
  • 啊,我误解了你的意图。我不认为你可以在“light”模式下在一行上做let rec ... and ...
【解决方案2】:

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

【讨论】:

  • 你和@kvb 都为我提供了很好的工作,但不是我想要的。使用#light "on",我希望能够在一行上编写递归绑定,它可以很好地与#light "off" 一起使用,无需任何额外的语法。
  • @Stephen - 啊,我现在明白这个问题了。不幸的是,我认为没有办法做到这一点(有关一些详细信息,请参阅编辑)
猜你喜欢
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2021-08-24
相关资源
最近更新 更多