#monads #macro #do

mdo

使用宏和鸭子类型为 Rust 实现的 Monadic do 语法

2 个不稳定版本

使用旧的 Rust 2015

0.3.0 2016年6月23日
0.2.0 2015年2月10日

1894Rust 模式

每月 40 次下载
2 个crate 中使用

WTFPL 许可证

10KB
214

Rust mdo 构建状态

演示

Rust mdo 是一种使用宏和鸭子类型的 Monadic do 语法。它提供了一种类似 Haskell do 语法的方法扩展,并使用 bind 函数进行重写。它还提供了一些常见 Monadic 结构的函数。

示例

将以下内容添加到您的 Cargo.toml

[dependencies]
mdo = "*"
#[macro_use] extern crate mdo;

fn main() {
    // exporting the monadic functions for the Iterator monad (similar
    // to list comprehension)
    use mdo::iter::{bind, ret, mzero};

    // getting the list of (x, y, z) such that
    //  - 1 <= x <= y < z < 11
    //  - x^2 + y^2 == z^2
    let l = bind(1i32..11, move |z|
                 bind(1..z, move |x|
                      bind(x..z, move |y|
                           bind(if x * x + y * y == z * z { ret(()) }
                                else { mzero() },
                                move |_|
                                ret((x, y, z))
                                )))).collect::<Vec<_>>();
    println!("{:?}", l);

    // the same thing, using the mdo! macro
    let l = mdo! {
        z =<< 1i32..11;
        x =<< 1..z;
        y =<< x..z;
        when x * x + y * y == z * z;
        ret ret((x, y, z))
    }.collect::<Vec<_>>();
    println!("{:?}", l);
}

文档

您可以在 这里 找到 rustdoc 文档。

许可证

本作品是免费的。您可以在 Do What The Fuck You Want To Public License, Version 2 的条款下重新分发和/或修改它,由 Sam Hocevar 发布。有关更多详细信息,请参阅 COPYING 文件。

无运行时依赖