Rust没有高种类类型。例如,在Rust中无法编写函子(因此也无法编写单子)。我想知道是否有深层次的原因解释了这一点,以及为什么。
例如,我可以理解的原因是:缺乏零成本抽象使HKT成为可能。或者类型推断变得更加困难。当然,我还在寻找一种解释,向我展示这是一个真正的限制。
如果答案已经在其他地方给出,请给我链接?
Rust没有高种类类型。例如,在Rust中无法编写函子(因此也无法编写单子)。我想知道是否有深层次的原因解释了这一点,以及为什么。
例如,我可以理解的原因是:缺乏零成本抽象使HKT成为可能。或者类型推断变得更加困难。当然,我还在寻找一种解释,向我展示这是一个真正的限制。
如果答案已经在其他地方给出,请给我链接?
时间与优先级.
没有Higher Kinded Types并不是一项设计决策。Rust计划引入某种形式的Higher Kinded Types,目前最受欢迎的候选者是通用关联类型 (2017)。
然而,实现这些需要时间,并且相对于其他功能,它们还没有被视为优先级。例如,async/await比HKTs更受重视,同时const泛型也似乎被优先考虑。
trait Unplug {
type F; //The representation type of the higher-kinded type
type A; //The parameter type
}
trait Plug<A> {
type result_t;
}
pub struct Concrete<M: Unplug + Plug<A>,A> {
pub unwrap: <M as Plug<A>>::result_t
}
impl<M: Unplug + Plug<A>, A> Concrete<M,A> {
fn of<MA: Unplug<F=M, A=A> + Plug<A>>(x: MA) -> Self
where M: Plug<A, result_t = MA>
{
Concrete { unwrap: x }
}
}
他们使用一个Functor
特质来实现:
pub trait Functor: Unplug + Plug<<Self as Unplug>::A> {
fn map<B, F>(f: F, s: Self) -> <Self as Plug<B>>::result_t
where
Self: Plug<B>,
F: FnMut(<Self as Unplug>::A) -> B
;
}
// Example impl for a represented Vec
impl<A> Functor for Concrete<Vec<forall_t>, A> {
// remember, Self ~ (Vec<_>, A) ~ "f a"
fn map<B, F>(f: F, s: Self) -> <Self as Plug<B>>::result_t
where
F: FnMut(<Self as Unplug>::A) -> B
{
Concrete::of(s.unwrap.into_iter().map(f).collect())
}
}
从那时起构建Applicative
和Monad
:
pub trait Applicative: Functor {
fn pure(s: <Self as Unplug>::A) -> Self;
fn app<B, F>(
f: <Self as Plug<F>>::result_t, //M<F>
s: Self //M<A>
) -> <Self as Plug<B>>::result_t //M<B>
where
F: FnMut(<Self as Unplug>::A) -> B + Clone,
Self: Plug<F> + Plug<B> + Unplug,
<Self as Plug<F>>::result_t:
Unplug<F=<Self as Unplug>::F, A=F> +
Plug<F> +
Clone,
<Self as Unplug>::F: Plug<F>
;
}
pub trait Monad : Applicative {
fn bind<F,B>(f: F, s: Self) -> <Self as Plug<B>>::result_t
where
Self: Plug<F>+Plug<B>,
F: FnMut(<Self as Unplug>::A) ->
<Self as Plug<B>>::result_t + Clone
;
}
我确实说过它有点笨重...