如何在 Rust 中实现 Functor 特征?

问题描述 投票:0回答:1

我正在研究《程序员范畴论》,其挑战之一是实现 Functor 接口。

rust category-theory
1个回答
0
投票

与计算机科学中的另一个问题一样,通过添加一定程度的间接性。也就是说,您可以定义相关类型的family,然后使用它来强制执行适当的约束。

一个家庭,归根结底是相当微不足道的:

trait Family {
    type Member<T>;
}

trait FamilyMember<T> {
    type Of: Family<Member<T> = Self>;
}

struct VecFamily;

impl Family for VecFamily {
    type Member<T> = Vec<T>;
}

impl<T> FamilyMember<T> for Vec<T> {
    type Of = VecFamily;
}

然后你可以利用函子来利用它:

trait Functor<A>: FamilyMember<A> {
    fn map<B>(self, f: impl FnMut(A) -> B) -> <Self::Of as Family>::Member<B>;
}

impl<A> Functor<A> for Vec<A> {
    fn map<B>(self, f: impl FnMut(A) -> B) -> Vec<B> {
        self.into_iter().map(f).collect()
    }
}

有点拗口...但是它确实可以在稳定版上编译

© www.soinside.com 2019 - 2024. All rights reserved.