#macro #utility #math #parser #no-std

no-std mathelogos

使 Rust 成为函数式编程语言的库

2 个版本

0.1.1 2024 年 5 月 18 日
0.1.0 2024 年 5 月 18 日

#1344Rust 模式

Apache-2.0

9KB
137

Mathelogos

简介

Mathelogos 库旨在将函数式编程结构引入 Rust,Rust 是一种以系统编程能力和性能著称的语言。通过利用宏,Mathelogos 在 Rust 生态系统内模仿了函数式语言(如 Haskell)的表达性和简洁性。本文档解释了 Mathelogos 提供的函数式结构,将它们与 Haskell 对应的结构进行比较,并阐述了此库的动机和目标。

Mathelogos 的目标

Mathelogos 的主要目标是促进 Rust 中的函数式编程范式,增强熟悉函数式编程的开发者的语言能力。这包括以与 Rust 自己的特性(如所有权和类型安全)无缝集成的方式引入诸如高阶函数、惰性求值和单子等概念。通过这样做,Mathelogos 旨在结合 Rust 的性能和安全性与函数式编程的表达力。

Mathelogos 中的函数式结构

Mathelogos 引入了一些宏来模拟函数式编程结构

  • lambda!:创建匿名函数,类似于 Haskell 中的 lambda 表达式。
  • compose!:将两个函数组合成单个操作,类似于 Haskell 中的函数组合。
  • map!:转换列表的元素,对应于 Haskell 的 map
  • curry!:将接受多个参数的函数转换为一系列接受单个参数的函数。
  • foldl!:实现左折叠,类似于 Haskell 的 foldl
  • list_comprehension!:提供对集合进行过滤和映射的语法,类似于 Haskell 的列表推导。
  • filter!:基于谓词过滤集合的元素,类似于 Haskell 的 filter
  • reduce!:使用二元函数组合集合的元素,类似于 Haskell 的 foldl,但在其他语言中通常称为 reduce
  • match_with!:一个模式匹配结构,简化了复杂的条件逻辑。

与 Haskell 的比较

为了说明 Mathelogos 的用法及其与 Haskell 的比较,考虑以下示例

lambda 和 Compose

Rust 使用 Mathelogos

let lambda_example = lambda!(x, y => x + y);
let add_two_and_mul_by_three = compose!(|x| mul(x, 3), |x| add(x, 2));

Haskell

lambdaExample = \x y -> x + y
addTwoAndMulByThree = (\x -> mul x 3) . (\x -> add x 2)

Map 和 Fold

Rust 使用 Mathelogos

let squared_numbers = map!(|&x| x * x, &numbers);
let sum = foldl!(|acc, &x| acc + x, 0, &numbers);

Haskell

squaredNumbers = map (\x -> x * x) numbers
sum = foldl (+) 0 numbers

列表推导和惰性求值

Rust 使用 Mathelogos

let evens_squared = list_comprehension!(x * x, x <- &numbers, x % 2 == 0);
let mut lazy_value = Thunk::new(|| { add(5, 10) });

Haskell

evensSquared = [x * x | x <- numbers, even x]
lazyValue = let value = add 5 10 in value

单调操作

Rust 使用 Mathelogos

let result = Maybe::Just(5).map(|x| x * 2);

Haskell

result = Just 5 >>= \x -> return (x * 2)

许可证

Mathelogos 使用 Apache 许可协议第 2.0 版许可。请参阅 LICENSE 文件。

没有运行时依赖