此函数将两个列表合并在一起:
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]
第二次屈服!必须在第一个之下正确,否则会抱怨。为什么?我知道产量如何!可以,但是对我来说有点奇怪,语法必须在此示例中完全像这样编写。
答案 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>