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

List 什么';使用的原因是什么;在F#列表中,而不是,?,list,syntax,f#,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 ] 在我看来,,更自然,更容易看上眼睛。只是想知道使用背后的想法?(不是批评)是的,你必须这样做。原因是在F#中,逗号运算符用于元组表达式。因此表达式1,2,…9被解释为一个包含9个值的元组 [1,2] // List with 1 eleme

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

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 ]

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

是的,你必须这样做。原因是在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,2,3,4,5]
是int*int*int*int*int类型的1个元素的列表

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

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

让bar=[1..9]
,1..9是一个范围,因此它被展开为1;2.3.9;

让blort=[对于1..9->i中的i]
是一种理解,它也做了同样的事情——对于某些性能问题,它的能力更强一些

编辑:为了完整性,您也可以这样做

let foo = [1
           2
           3]

并列出[1;2;3]

其他答案指出了主要原因

另一方面,值得注意的是,与语言中使用分号的大多数其他地方一样,另一种选择是换行符。比如说

[ "foo"; "bar"; "baz" ]
也可以写成

[ "foo"
  "bar"
  "baz" ]
或其他各种用换行符替换分号的布局

只是想知道使用

元组在ML中更常见,并且使用
允许您将元组列表编写为:

[1, 2; 3, 4]

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

感谢Jared,那么之所以将其用于元组,是因为定义文字元组比定义文字列表更常见,对吗?@Joan我不知道这个选择的历史,除了它是OCaml的保留。请注意,在OCaml中,调用
f(x,y)
意味着使用一个元组
(x,y)
的参数调用
f
。如果要提出“最常见的应该使用逗号”的基本原理,参数列表可能比文本列表更常见。请注意,如果F#有类似Python的元组语法,其中元组周围有paren,则列表项之间可以有逗号。@Gabe:有;他们周围有帕伦斯。我一直在想你说的那一点。谢谢,为什么[1..9]会受到性能惩罚?编译器不是只是将其展开到[1;2;3…9]吗?在[1..9]的情况下,不应该有,但是列表理解可能会变得非常复杂,例如[1..9->i*i]中的i,我尝试在列表理解中使用嵌套for循环,另一方面,有一些实质性问题序列工作得很好。谢谢,通过“实质性问题”你是说性能问题?同样地,[1..9]在编译时展开,但是[1..9中的i->i*i]在运行时展开?或者它们都是在运行时执行的?哦,哇,谢谢。你真的能做[1;2;3]得到[1;2;3]吗?那就更好了。好多了。再次感谢。关于格式问题,我很抱歉,这应该能让大家明白,如上所述,您可以使用新行分隔列表