类型
类型 定义了一组值及其操作。类型从不作为语法的一部分显式声明,除了作为内置语句的一部分。类型总是从值的使用中推断。类型推断遵循亨德利-米尔纳风格的推断系统。
联合类型
联合类型定义了一组类型。 在下面的例子中,联合类型被指定如下:
T = t1 | t2 | ... | tn
其中 t1, t2, …, 和 tn 是类型。
在上面的例子中,类型 T 的值可以是类型 t1、类型 t2、… 或类型 tn。
基本类型
所有Flux数据类型都是由以下类型构成的:
空类型
空类型表示缺失或未知的值。
空类型的名称是null。
只有一个值构成空类型,那就是null值。
如果类型t可以如下表达,则它是可为空的:
t = {s} | null
其中 {s} 定义了一组值。
布尔类型
A 布尔类型表示一个真值,对应于预先指定的变量 true 和 false。
布尔类型的名称是 bool。
布尔类型是可为空的,可以形式上指定如下:
bool = {true, false} | null
数字类型
A 数字类型 代表整数或浮动点值的集合。
以下数字类型存在:
uint the set of all unsigned 64-bit integers | null
int the set of all signed 64-bit integers | null
float the set of all IEEE-754 64-bit floating-point numbers | null
所有数字类型都是可为空的。
时间类型
A 时间类型表示一个具有纳秒精度的单个时间点。
时间类型名称是 time。
时间类型是可空的。
时间戳格式
Flux 支持 RFC3339 时间戳:
YYYY-MM-DDYYYY-MM-DDT00:00:00ZYYYY-MM-DDT00:00:00.000Z
持续时间类型
A duration type 表示一个具有纳秒精度的时间长度。
持续时间类型名称是 duration。
持续时间类型是可空的。
持续时间类型的示例
1ns // 1 nanosecond
1us // 1 microsecond
1ms // 1 millisecond
1s // 1 second
1m // 1 minute
1h // 1 hour
1d // 1 day
1w // 1 week
1mo // 1 calendar month
1y // 1 calendar year
3d12h4m25s // 3 days, 12 hours, 4 minutes, and 25 seconds
字符串类型
一个 字符串类型 表示一个可能为空的字符序列。
字符串是不可变的,一旦创建就不能被修改。
字符串类型名称是 string。
字符串类型是可以为null的。
一个空字符串不是一个空值。
字节类型
A bytes type 表示一系列字节值。
字节类型名称是 bytes。
正则表达式类型
A regular expression type 表示所有正则表达式模式的集合。
正则表达式类型名称是 regexp。
正则表达式类型是 不 可为空的。
复合类型
这些是由基本类型构造的类型。复合类型不能为null。
数组类型
一个 数组类型 表示任何其他类型值的序列。
数组中的所有值必须是相同类型。
数组的长度是数组中元素的数量。
记录类型
A 记录类型 代表一组无序的键和值对。 键必须始终是一个字符串。 值可以是任何其他类型,且不必与记录内的其他值相同。
记录中的键只能静态引用。
类型推断确定记录中存在的属性。如果类型推断确定了记录中的所有属性,则称其为“有界的”。在记录的类型中,不一定所有的键都是已知的,在这种情况下,记录称为“无界的”。无界记录可能包含任何属性,除了已知包含的属性之外。
字典类型
一个 字典类型 是一个将键与值关联的集合。 键必须是可以比较的并且类型相同。 值也必须是相同类型。
函数类型
一个 函数类型 表示具有相同参数和结果类型的所有函数的集合。 函数的参数总是被命名(没有位置参数)。 因此,实现一个函数类型要求参数的名称相同。
流类型
一个 流类型 代表一个无界的值集合。值必须是记录,并且这些记录只能包含 int、uint、float、string、time 或 bool 类型。
多态
Flux 函数可以是多态的,这意味着一个函数可以应用于不同类型的参数。Flux 支持参数化、多记录和临时多态。
参数多态性
参数多态性是指一个函数可以统一地应用于任何类型的参数。 例如:
f = (x) => x
f(x: 1)
f(x: 1.1)
f(x: "1")
f(x: true)
f(x: f)
在add函数的主体中,标识符a和b被用作int和float类型。
记录多态性
记录多态性是指一个函数可以应用于不同类型的记录。 例如:
john = {name:"John", lastName:"Smith"}
jane = {name:"Jane", age:44}
// John and Jane are records with different types.
// We can still define a function that can operate on both records safely.
// name returns the name of a person
name = (person) => person.name
name(person:john) // John
name(person:jane) // Jane
device = {id: 125325, lat: 15.6163, lon: 62.6623}
name(person:device) // Type error, "device" does not have a property name.
不同类型的记录可以被传递给同一个函数,只要它们包含必要的属性。
必要的属性由记录的使用情况决定。
临时多态性
临时多态性是一个概念,指的是一个函数可以应用于不同类型的参数,并根据类型具有不同的行为。
add = (a, b) => a + b
// Integer addition
add(a: 1, b: 1)
// String concatenation
add(a: "str", b: "ing")
// Addition not defined for boolean data types
add(a: true, b: false)
类型约束
类型约束用于实现静态的临时多态性。
例如,下面的函数仅对 Addable 类型定义:
add = (a, b) => a + b
传递一个记录到 add() 会导致编译时类型错误,因为记录是不可相加的。
// Records are not Addable and will result in an error.
add(a: {}, b: {})
约束从未被明确声明,而是从上下文中推断出来的。
可添加约束
可加类型是指二元算术运算符 + 接受的类型。整数、无符号整数、浮点数和字符串类型是 Addable。
可减去的约束
可减类型是二元算术运算符 - 可接受的类型。整数、无符号整数和浮点类型是 Subtractable。
可被整除约束
可被除的类型是二进制算术运算符 \ 所接受的类型。
整数、无符号整数和浮点数类型是 Divisible。
数值约束
整数、无符号整数和浮点类型是 Numeric。
可比较约束
可比较类型是指二进制比较运算符 <, <=, > 或 >= 接受的类型。整数、无符号整数、浮点数、字符串、持续时间和时间类型是 Comparable。
可等价约束
可比类型是指可以使用 == 或 != 运算符进行相等比较的类型。
布尔值、整数、无符号整数、浮点数、字符串、持续时间、时间、字节、数组和记录类型是 Equatable。
可为空约束
可空类型是那些可以是 null 的类型。
布尔型、整数型、无符号整数型、浮点型、字符串型、持续时间型和时间型都是 Nullable。
记录约束
记录是唯一符合此约束的类型。
可否否定的约束
可否取负的类型是指一元算术运算符 - 所接受的类型。整数、无符号整数、浮点数和持续时间类型是 Negatable。
时间约束
持续时间和时间类型是 Timeable。
可字符串化约束
可字符串化类型是可以在字符串插值中进行评估和表达的类型。
String, Integer, Uinteger, Float, Boolean, Time 和 Duration 类型都是 Stringable。