我写两个yield时为什么F#会抱怨呢!在一排?

时间:2018-11-07 01:11:00

标签: syntax f# visual-studio-code

此函数将两个列表合并在一起:

let append = fun a b -> [ yield! a
                          yield! b ]


append [1;2;3] [4;5;6]

val it : int list = [1; 2; 3; 4; 5; 6]

但是,如果我删除函数中列表括号开头的空格(例如[yield! ... ]),它将不再起作用。

如果我执行以下操作,它也会抱怨:

[ yield! a yield! b ]

// or this
[ yield! a
yield! b]

第二次屈服!必须在第一个之下正确,否则会抱怨。为什么?我知道产量如何!可以,但是对我来说有点奇怪,语法必须在此示例中完全像这样编写。

1 个答案:

答案 0 :(得分:3)

通常,F#允许您在许多地方使用缩进或显式语法,包括序列表达式。您可以通过添加分号将两个yield!构造放在一行上:

let append a b = 
  [ yield! a; yield! b ]

如果使用缩进,则F#要求序列表达式的语句对齐-因此,您的yield!构造必须以相同的偏移量开头。但是,您不必像第一个版本那样缩进它们。您可以编写:

let append a b = 
  [ yield! a
    yield! b ]

另一种也是有效的替代语法(我个人认为不错,但也可以使用)是将前[放在上一行,将]放在新一行:

let append a b = [ 
  yield! a
  yield! b 
]

请注意,我还用内联函数定义let append = fun a b ->替换了let append a b-您可以将参数立即放在函数名称之后,而不是使用fun创建显式函数。 / p>