我正在研究《程序员范畴论》,其挑战之一是实现 Functor 接口。
与计算机科学中的另一个问题一样,通过添加一定程度的间接性。也就是说,您可以定义相关类型的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()
}
}
有点拗口...但是它确实可以在稳定版上编译!