【问题标题】:Meaning of keyword "in" in F#F#中关键字“in”的含义
【发布时间】:2011-11-28 22:15:18
【问题描述】:

我刚开始学习 F#。在几个 F# 编码示例中,我看到关键字“in”以下列方式使用:

let doStuff x =
    let first, second = x in
    first + " " + second

该函数在第二行末尾带有和不带有“in”的情况下都有效。 “in”是做什么的?

【问题讨论】:

    标签: .net f#


    【解决方案1】:

    in 是 F# 的 OCaml 根的遗留物,它指定 bound 变量,这些变量与变量 scopes 略有不同。

    考虑变量绑定如下;你有一个表达式:

    first + " " + second
    

    就目前而言,firstsecond 是未绑定的 - 它们没有任何固定值 - 因此该表达式目前没有具体值。通过使用

    let (...) in
    

    语法您正在指定这些变量如何在该表达式中绑定,因此您的示例将使用变量替换将该函数缩减为

    let doStuff x =
      x + " " + x
    

    在这个例子中,两种形式是相同的,但想象一下:

    let (x = 2 and y = x + 2) in
         y + x
    

    这不会和

    一样工作
    let (x = 2 and y = x + 2)
         y + x
    

    因为在前一种情况下,x 仅在 in 关键字之后绑定。

    在后一种情况下,普通变量作用域规则生效,因此变量一被声明就被绑定。

    希望能解决问题。一般来说,您应该始终使用版本不带 in 并在 F# 源文件的开头指定 #light

    【讨论】:

    • 我认为问题中的代码不等同于let doStuff x = x + " " + x。我相信它相当于let doStuff x = (fst x) + " " + (snd x)。我错了吗?
    • 马克,这是很久以前的事了,但是这些例子在 F# 中不起作用,我认为它们可能永远不会起作用。这是 OCaml 唯一的语法吗?另外,“不同”是指一个在 OCaml 中编译,而另一个不是?因为否则我看不出他们怎么会有不同的结果。
    【解决方案2】:

    这是关于 SO 的另一个相关主题,可能也很有用:

    【讨论】:

      【解决方案3】:

      引用here

      当 light 语法选项是 启用 'in' 是可选的。 '=' 后面的记号 'let' 定义开始一个新块,其中 预解析器插入一个隐式分隔“in” 开始于的每个“让”绑定之间的标记 与该标记相同的列。

      没有轻量级语法选项“in” 经常需要。 'in' 是 可选当 light syntac 选项 被使用了。

      所以我猜你正在使用轻量级语法。

      【讨论】:

        猜你喜欢
        • 2015-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-29
        • 2017-07-20
        • 1970-01-01
        • 2012-04-04
        • 2012-09-08
        相关资源
        最近更新 更多