使用的原因是什么; 在F#列表而不是,?

Joa*_*nge 13 syntax f# list

这可能是一个奇怪的问题,但如果我想要定义一个整数列表:

1, 2, 3, 4, 5, 6, 7, 8, 9
Run Code Online (Sandbox Code Playgroud)

我需要使用;角色吗?

[ 1; 2; 3; 4; 5; 6; 7; 8; 9 ]
Run Code Online (Sandbox Code Playgroud)

代替?:

[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
Run Code Online (Sandbox Code Playgroud)

在我看来,,它更自然,更容易在眼睛上.只是想知道背后使用的想法;?(不批评)

Jar*_*Par 16

是的,你必须.原因是在F#中逗号运算符用于元组表达式.因此表达式1,2,...9被解释为具有9个值的单个元组.

[1,2] // List with 1 element that is a tuple value - (int*int) list
[1;2] // List with 2 elements that are integer values - int list
Run Code Online (Sandbox Code Playgroud)

  • @Joan我不知道这个选择的历史,除了它是OCaml的控制权. (3认同)
  • 请注意,如果F#具有像Python这样的元组语法,其中元组周围有parens,则可以在列表项之间使用逗号. (3认同)
  • @Gabe:确实如此; 他们周围有个parens.我一直想知道你提出的观点. (2认同)

Bri*_*ian 15

其他答案都指出了主要原因.

另外值得注意的是,与大多数其他地方使用分号的语言一样,另一种选择是换行.例如

[ "foo"; "bar"; "baz" ]
Run Code Online (Sandbox Code Playgroud)

也可以写成

[ "foo"
  "bar"
  "baz" ]
Run Code Online (Sandbox Code Playgroud)

或者用换行符替换分号的各种其他布局.


Sna*_*ark 7

[1,2,3,4,5] 是int*int*int*int*int类型的1个元素的列表

[1;2;3;4;5] 是一个int类型的5个元素的列表

此外,列表理解和范围是你的朋友

let bar = [1..9],1..9是一个范围,所以它被展开为1; 2; 3; ... 9;

let blort = [for i in 1..9 -> i] 理解是做同样的事情 - 对于某些性能问题更有力量.

编辑:为了完整起见,你也可以这样做

let foo = [1
           2
           3]
Run Code Online (Sandbox Code Playgroud)

并获得[1; 2; 3]的列表


Jon*_*rop 5

只是想知道使用 ; 背后的想法

元组在机器学习中更常见,使用它;可以让您将元组列表编写为:

[1, 2; 3, 4]
Run Code Online (Sandbox Code Playgroud)

从历史上看,F# 从 OCaml 继承了这种语法,OCaml 通过尝试从标准 ML 语法中删除更多多余的括号来创建其语法。