结构体与类型类 - inline-function/Sublimation GitHub Wiki
值类型,配合伴生命题:
struct User(name: Str, age: Nat) // 基础结构体
struct PosPoint(x: Nat, y: Nat)<x > 0, y > 0> // 伴生命题:构造时证明
struct Item(count: Nat = 1) // 字段默认值
构造与读取:
var u = User("Alice", 25)
print(u.name + " " + toStr(u.age)) // Alice 25
var i = Item() // count 用默认值 1
enum Color { Red; Green; Blue }
// 带数据的枚举(构造子)
enum Result[T, E] { Ok(T); Err(E) }
跨模块自动解析:Ok/Err 等裸名构造子在可见模块(含 stdlib)里依次查找。
class 声明一个类型类(接口/协议),impl 为具体类型实现它:
class Show {
fun show(): Str
}
impl Show for User {
fun show(): Str = "{ name=" + self.name + ", age=" + self.age + " }"
}
var u = User("Alice", 25)
print(u.show()) // { name=Alice, age=25 }
-
self是方法内指代接收者的内联标识。 - 方法糖:
u.show()自动解析到Show字典里的实现。
impl 一个类型本身(不实现类型类)就是扩展方法:
impl User {
fun isAdult(): Bool = self.age >= 18
}
u.isAdult() // true
class Eq {
fun eq(other: Self): Bool
}
fun firstOrAny[A](xs: List[A], d: A): A = ...
stdlib 的 Collection 类型类统一了 List/Set/Map 的接口:
fun report[T](xs: List[T]) {
print(xs.size(), xs.isEmpty(), xs.contains(xs.head()?.getOrElse(0)))
}
x.f() 的解析顺序:
- 同名自由函数/扩展方法(优先)
- 类型类字典里的方法
- 结构体自身的字段
// x.f() 优先命中自由函数 f(x),其次是类型类的 f