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

时间:2010-09-20 17:42:51

标签: list syntax f#

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

1, 2, 3, 4, 5, 6, 7, 8, 9

我是否需要使用;字符进行操作?

[ 1; 2; 3; 4; 5; 6; 7; 8; 9 ]

而不是?:

[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:14)

其他答案指出了主要原因。

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

[ "foo"; "bar"; "baz" ]

也可以写成

[ "foo"
  "bar"
  "baz" ]

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

答案 2 :(得分: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]

并获取[1; 2; 3]

的列表

答案 3 :(得分:4)

  

只是想知道背后的想法;?

元组在ML中更常见,使用;可以编写元组列表:

[1, 2; 3, 4]

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