gpt4 book ai didi

rust - 提升功能到选项

转载 作者:行者123 更新时间:2023-12-03 11:42:55 25 4
gpt4 key购买 nike

有没有办法解除一个简单的功能,像这样

fn add(a:i32, b:i32) -> i32 {a+b}
操作 Option (或任何其他单子(monad)类型),类似于使用 Applicative 的方式在 Haskell我知道这个解决方案:
pub fn add(a: Option<i32>, b: Option<i32>) -> Option<i32> {
Some(a? + b?)
}
但这需要我实际编写一个单独的函数,它与 Option 紧密耦合,而我想要的是能够将任意函数提升为任意单子(monad)类型,或者以其他方式重用对带有参数的简单类型和单子(monad)类型的返回值进行操作的函数
// something like this
let func = Option::lift2(add) //example, not working code
我显然在想 Haskell ,也许在 Rust 中有更惯用的方法

最佳答案

你可以从这个开始:

fn lift<A, B, C>(f: impl Fn(A, B)->C) -> impl Fn(Option<A>, Option<B>)->Option<C> {
move |oa, ob| {
match (oa, ob) {
(Some(a), Some(b)) => Some(f(a,b)),
_ => None,
}
}
}
或者,为了缩短:
fn lift<A, B, C>(f: impl Fn(A, B)->C) -> impl Fn(Option<A>, Option<B>)->Option<C> {
move |a, b| Some(f(a?, b?))
}
请注意, FnMut 可能需要类似的东西。和 FnOnce , 也。
而且,上面还是绑定(bind) Option ,而不是一般的单子(monad)事物,这在 Rust 中模拟非常麻烦(如果可能的话)。

关于rust - 提升功能到选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63260988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com