在F#中,这些看起来像什么的东西是什么?

时间:2015-02-17 17:19:25

标签: f#

在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 }

3 个答案:

答案 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 }是包含两个字段aabb的记录类型的值。

答案 1 :(得分:4)

райтфолд提供的答案给你答案,下次你有这样的问题时,我会尝试给你一个自己答案的方法。

最简单的方法是使用F# interactive(您可以从View中的Visual Studio启动它 - >其他Windows - > F#Interactive)。只需键入F#代码,添加双分号;;并按Enter。要使声明有效,您必须先声明abcd。让它们全部整数:

> 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]

类似的概念,这次它是listint元素。

> 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|]

这些与s1s2非常相似,但list元素类型后面跟着[] - 这意味着它是an arrays5(int * int * int * int)个元素的数组,s6int个元素的数组。

> 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;}

它可以工作并打印s8myRecordType的实例:

> 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 定义。