结构体与类型类 - inline-function/Sublimation GitHub Wiki

结构体与类型类

结构体 struct

值类型,配合伴生命题:

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

enum Color { Red; Green; Blue }

// 带数据的枚举(构造子)
enum Result[T, E] { Ok(T); Err(E) }

跨模块自动解析:Ok/Err 等裸名构造子在可见模块(含 stdlib)里依次查找。

类型类 class

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() 的解析顺序:

  1. 同名自由函数/扩展方法(优先)
  2. 类型类字典里的方法
  3. 结构体自身的字段
// x.f() 优先命中自由函数 f(x),其次是类型类的 f
⚠️ **GitHub.com Fallback** ⚠️