在F#中,有许多不同的集合式语法可以编译成某种东西。它们都是什么,它们是什么意思?
let s1 = [a, b, c, d]
let s2 = [a; b; c; d]
let s3 = (a, b, c, d)
let s4 = (a, b, c, d)
let s5 = [|a, b, c, d|]
let s6 = [|a; b; c; d|]
let s7 = a, b, c, d
let s8 = { aa = 3; bb = 4 }
答案 0 :(得分:6)
[a, b, c, d]
是一个包含单个4元组元素的列表。
[a; b; c; d]
是一个四元素列表。
(a, b, c, d)
是一个4元组。
[|a, b, c, d|]
是一个以4个元组为元素的数组。
[|a; b; c; d|]
是一个四元素数组。
a, b, c, d
是一个4元组。
{ aa = 3; bb = 4 }
是包含两个字段aa
和bb
的记录类型的值。
答案 1 :(得分:4)
райтфолд提供的答案给你答案,下次你有这样的问题时,我会尝试给你一个自己答案的方法。
最简单的方法是使用F# interactive(您可以从View中的Visual Studio启动它 - >其他Windows - > F#Interactive)。只需键入F#代码,添加双分号;;
并按Enter。要使声明有效,您必须先声明a
,b
,c
和d
。让它们全部整数:
> let a = 1
let b = 2
let c = 3
let d = 4
;;
val a : int = 1
val b : int = 2
val c : int = 3
val d : int = 4
现在您可以尝试声明:
> let s1 = [a, b, c, d];;
val s1 : (int * int * int * int) list = [(1, 2, 3, 4)]
F#Interactive打印回评估的表达式类型。在那种情况下,它是(int * int * int * int) list
。怎么看? *
用于划分tuple type的元素,因此(int * int * int * int)
表示具有四个元素的元组,所有类型均为int
。关注list
意味着a list。因此,(int * int * int * int) list
是一个元组列表,每个元组都有四个int
类型的元素。
> let s2 = [a; b; c; d];;
val s2 : int list = [1; 2; 3; 4]
类似的概念,这次它是list
个int
元素。
> let s3 = (a, b, c, d);;
val s3 : int * int * int * int = (1, 2, 3, 4)
上面已经解释了这个问题:int * int * int * int
是一个四元素元组,所有元素都输入为int
。
> let s5 = [|a, b, c, d|]
let s6 = [|a; b; c; d|];;
val s5 : (int * int * int * int) [] = [|(1, 2, 3, 4)|]
val s6 : int [] = [|1; 2; 3; 4|]
这些与s1
和s2
非常相似,但list
元素类型后面跟着[]
- 这意味着它是an array。 s5
是(int * int * int * int)
个元素的数组,s6
是int
个元素的数组。
> let s7 = a, b, c, d;;
val s7 : int * int * int * int = (1, 2, 3, 4)
与s3
相同。
> let s8 = { aa = 3; bb = 4 };;
let s8 = { aa = 3; bb = 4 };;
-----------^^
stdin(18,12): error FS0039: The record label 'aa' is not defined
这个很棘手。要使其工作,您必须先声明record type:
> type myRecordType = { aa: int; bb: int };;
type myRecordType =
{aa: int;
bb: int;}
它可以工作并打印s8
是myRecordType
的实例:
> let s8 = { aa = 3; bb = 4 };;
val s8 : myRecordType = {aa = 3;
bb = 4;}
答案 2 :(得分:2)
let s1 = [a, b, c, d]
相当于[(a, b, c, d)]
:包含一个四元组的列表( tuple 包含4个元素。)
let s2 = [a; b; c; d]
list ,包含4个元素。
let s3 = (a, b, c, d)
一个四倍。
let s4 = (a, b, c, d)
同样的四倍。
let s5 = [|a, b, c, d|]
相当于[|(a, b, c, d)|]
: array ,包含一个四倍。
let s6 = [|a; b; c; d|]
一个包含4个元素的数组。
let s7 = a, b, c, d
四倍(在这种情况下可以省略括号,当没有歧义时)。
let s8 = { aa = 3; bb = 4 }
record 定义。