类型
类型定义了值的集合以及对这些值的操作。类型永远不会作为语法的一部分显式声明,除非作为内置语句的一部分。类型始终从值的用法中推断出来。类型推断遵循 Hindley-Milner 风格的推断系统。
联合类型
联合类型定义了一组类型。在下面的示例中,联合类型指定如下
T = t1 | t2 | ... | tn
其中 t1
、t2
、… 和 tn
是类型。
在上面的示例中,T
类型的值可以是 t1
类型、t2
类型、… 或 tn
类型。
基本类型
所有 Flux 数据类型都由以下类型构成
空类型
空类型表示缺失值或未知值。空类型名称是 null
。空类型只包含一个值,即空值。如果类型 t
可以表示为如下形式,则该类型是可为空的
t = {s} | null
其中 {s}
定义了一组值。
布尔类型
布尔类型表示真值,对应于预先分配的变量 true
和 false
。布尔类型名称是 bool
。布尔类型是可为空的,可以正式指定如下
bool = {true, false} | null
数值类型
数值类型表示整型或浮点型值的集合。
存在以下数值类型
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
所有数值类型都是可为空的。
时间类型
时间类型表示时间轴上的单个点,精度为纳秒。时间类型名称是 time
。时间类型是可为空的。
时间戳格式
Flux 支持 RFC3339 时间戳
YYYY-MM-DD
YYYY-MM-DDT00:00:00Z
YYYY-MM-DDT00:00:00.000Z
持续时间类型
持续时间类型表示时间长度,精度为纳秒。持续时间类型名称是 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
。字符串类型是可为空的。
空字符串不是空值。
字节类型
字节类型表示字节值序列。字节类型名称是 bytes
。
正则表达式类型
正则表达式类型表示正则表达式的所有模式的集合。正则表达式类型名称是 regexp
。正则表达式类型不是可为空的。
复合类型
这些类型由基本类型构成。复合类型不可为空。
数组类型
数组类型表示任何其他类型的值序列。数组中的所有值必须是相同的类型。数组的长度是数组中元素的数量。
记录类型
记录类型表示一组无序的键值对。键必须始终是字符串。值可以是任何其他类型,并且不必与记录中的其他值相同。
记录中的键只能静态引用。
类型推断确定记录中存在的属性。如果类型推断确定了记录中的所有属性,则称其为“有界”。并非所有键都可以在记录的类型中已知,在这种情况下,该记录被称为“无界”。除了已知包含的属性外,无界记录还可以包含任何属性。
字典类型
字典类型是将键与值关联的集合。键必须是可比较的且类型相同。值也必须是相同的类型。
函数类型
函数类型表示具有相同参数和结果类型的所有函数的集合。函数参数始终是命名的(没有位置参数)。因此,实现函数类型要求参数名称相同。
流类型
流类型表示无界的值集合。这些值必须是记录,并且这些记录只能保存 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 约束
Addable 类型是二进制算术运算符 +
接受的类型。Integer、Uinteger、Float 和 String 类型是 Addable
。
Subtractable 约束
Subtractable 类型是二进制算术运算符 -
接受的类型。Integer、Uinteger 和 Float 类型是 Subtractable
。
Divisible 约束
Divisible 类型是二进制算术运算符 \
接受的类型。Integer、Uinteger 和 Float 类型是 Divisible
。
Numeric 约束
Integer、Uinteger 和 Float 类型是 Numeric
。
Comparable 约束
Comparable 类型是二进制比较运算符 <
、<=
、>
或 >=
接受的类型。Integer、Uinteger、Float、String、Duration 和 Time 类型是 Comparable
。
Equatable 约束
Equatable 类型是可以使用 ==
或 !=
运算符进行相等性比较的类型。Boolean、Integer、Uinteger、Float、String、Duration、Time、Bytes、Array 和 Record 类型是 Equatable
。
Nullable 约束
Nullable 类型是可以为 null 的类型。Boolean、Integer、Uinteger、Float、String、Duration 和 Time 类型是 Nullable
。
Record 约束
记录是唯一属于此约束的类型。
Negatable 约束
Negatable 类型是单目算术运算符 -
接受的类型。Integer、Uinteger、Float 和 Duration 类型是 Negatable
。
Timeable 约束
Duration 和 Time 类型是 Timeable
。
Stringable 约束
Stringable 类型是可以求值并在字符串插值中表示的类型。String、Integer、Uinteger、Float、Boolean、Time 和 Duration 类型是 Stringable
。
这个页面对您有帮助吗?
感谢您的反馈!