【问题标题】:Multiple let statements on the same line in F#F# 中同一行上的多个 let 语句
【发布时间】:2023-03-16 21:47:01
【问题描述】:
module Digits
type Digit = Unison | Semitone | Tone | MinorThird | MajorThird | PerfectFourth | AugmentedFourth | PerfectFifth | MinorSixth | MajorSixth | MinorSeventh | MajorSeventh type 'd GeneralizedDigit = SmallDigit of 'd | Octave type 't Number = EmptyNumber | CountedNumber of 't * 't Number
let swapOctave: Digit GeneralizedDigit -> Digit GeneralizedDigit = fun x -> match x with SmallDigit Unison -> Octave | Octave -> SmallDigit Unison | g -> g
let limitLength: 'r Number -> Digit = fun a -> match a with EmptyNumber -> Unison | CountedNumber(_,EmptyNumber) -> Semitone | CountedNumber(_,CountedNumber(_,EmptyNumber)) -> Tone | CountedNumber(_,CountedNumber(_,CountedNumber(_,EmptyNumber))) -> MinorThird | _ -> MajorSeventh

在 F# 中,我可以将多个 type 定义放在同一行而不使用分号而不会出现任何问题,但是当我删除 let 语句之间的换行符时,我会收到错误 FS0010。我知道在 Haskell 语句中可以用单个分号分隔,但在 F# 中,单个分号和双分号都不起作用。如何在同一行中有多个 let 语句?

【问题讨论】:

    标签: syntax f#


    【解决方案1】:

    您可以使用let .. in 语法来做到这一点,如下所示:

    let f () = let a = 1 in let b = 2 in a + b
    f () // gives 3 as a result
    

    但我真的建议不要像这样进行多个单行定义。人们很难阅读。

    【讨论】:

      【解决方案2】:

      正如 Phillip 所解释的,let .. in .. 构造允许您将局部变量定义为单行表达式的一部分。

      但是,您的示例似乎试图在一个模块中定义多个顶级定义,这是您使用 let .. in .. 无法实现的。

      据我所知,您实际上可以通过用两个分号分隔定义来做到这一点,即;;。如果我将以下内容保存为test.fs 并使用#load 加载它,我不会收到任何错误:

      module Digits
      type Digit = Unison | Semitone | Tone | MinorThird | MajorThird | PerfectFourth | AugmentedFourth | PerfectFifth | MinorSixth | MajorSixth | MinorSeventh | MajorSeventh type 'd GeneralizedDigit = SmallDigit of 'd | Octave type 't Number = EmptyNumber | CountedNumber of 't * 't Number
      let swapOctave: Digit GeneralizedDigit -> Digit GeneralizedDigit = fun x -> match x with SmallDigit Unison -> Octave | Octave -> SmallDigit Unison | g -> g;; let limitLength: 'r Number -> Digit = fun a -> match a with EmptyNumber -> Unison | CountedNumber(_,EmptyNumber) -> Semitone | CountedNumber(_,CountedNumber(_,EmptyNumber)) -> Tone | CountedNumber(_,CountedNumber(_,CountedNumber(_,EmptyNumber))) -> MinorThird | _ -> MajorSeventh 
      

      我在 F# 5.0 中对此进行了测试。可能是这种情况在 F# 6 中发生了变化,removed deprecated features like #light "off"。帖子中没有讨论 ;; 的删除,但它可能是相关的更改。如果是这种情况,您可以将其报告为回归 - 但可能也应该删除对 ;; 的支持!

      正如菲利普所说,我看不出有任何实际尝试这样做的理由。

      【讨论】:

        【解决方案3】:

        如果您想要多个 let 绑定来将值绑定到变量,那么您也可以使用“元组语法”。

        let x,y,z = 1, "Hi", 3.0
        

        【讨论】:

          猜你喜欢
          • 2017-02-04
          • 2010-10-25
          • 2020-02-09
          • 2021-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多