#creation #type #type-safe #predicate #i32 #values

refinement

方便创建类型安全的精炼类型

5 个版本 (破坏性更新)

0.5.0 2022 年 8 月 21 日
0.4.0 2022 年 8 月 2 日
0.3.0 2021 年 1 月 5 日
0.2.0 2021 年 1 月 3 日
0.1.0 2021 年 1 月 3 日

#21#predicate

MIT 许可证

14KB
340

refinement

方便创建类型安全的精炼类型。

安装

查看 cargo 包

文档

查看 docs.rs


lib.rs:

方便创建类型安全的精炼类型。

该 crate 试图捕捉精炼类型的概念,精炼类型是一种赋予谓词的类型,假设该谓词对精炼类型的任何元素都成立。^1

当运行时只期望类型的一定值时,精炼类型非常有用。例如,假设有一个只对偶数进行逻辑处理的函数。

fn takes_even(i: i32) {
    if i % 2 == 0 {
        println!("Received even number {}", i);
    } else {
        panic!("Received odd number");
    }
}

takes_even(1);  // oops

使用精炼类型,这个函数可以定义得不可能提供奇数。

use refinement::{Refinement, Predicate};

struct Even;

impl Predicate<i32> for Even {
    fn test(x: &i32) -> bool {
        *x % 2 == 0
    }
}

type EvenInt = Refinement<i32, Even>;

fn takes_even(i: EvenInt) {
    println!("Received even number {}", i);
}

match EvenInt::new(4) {
    Some(x) => takes_even(x),  // "Received even number 4"
    None => { /* ... */ }      // Handle logical error
}

无运行时依赖