#function #curry #fp #haskell

nightly currying

一个用于对实现 FnOnce 的任何事物进行柯里化的crate。参数可以逐个传递,生成一个新的实现 FnOnce(可能还有 FnMut 和 Fn)的东西,可以调用一个参数更少的。

4 个版本

0.2.2 2023年11月23日
0.2.1 2023年7月3日
0.2.0 2023年7月3日
0.1.0 2023年3月20日

1208数学

27 每月下载次数
3 个 crates 中使用(通过 polynomial_ops

MIT 许可证

10KB
153 代码行

一个用于对实现 FnOnce 的任何事物进行柯里化的crate。

参数可以逐个传递,生成一个新的实现 FnOnce(可能还有 FnMut 和 Fn)的东西,可以调用一个参数更少的。


lib.rs:

一个用于 Rust 中函数柯里化的crate

柯里化是一种函数式编程术语,本质上意味着将第一个参数传递给函数,生成一个新的函数,只需要下一个参数。

示例

use currying::*;

let f = |x, y, z| x + y + z;
let (x, y, z) = (1, 2, 3);

let fx = f.curry(x);

assert_eq!(fx(y, z), f(x, y, z));

let fxy = fx.curry(y);

assert_eq!(fxy(z), f(x, y, z));

let fxyz = fxy.curry(z);

assert_eq!(fxyz(), f(x, y, z));

柯里化也可以在编译时进行。

#![feature(const_trait_impl)]

use currying::*;

const fn f(x: u8, y: u8, z: u8) -> u8
{
    x + y + z
}

const X: u8 = 1;
const Y: u8 = 2;
const Z: u8 = 3;

const ASSERTIONS: [bool; 3] = {
    let fx = f.curry(X);
    let fxy = fx.curry(Y);
    let fxyz = fxy.curry(Z);
    [
        fx(Y, Z) == f(X, Y, Z),
        fxy(Z) == f(X, Y, Z),
        fxyz() == f(X, Y, Z)
    ]
};

assert_eq!(ASSERTIONS, [true; 3]);

依赖项

~1.5MB
~36K SLoC