0
4

1 回答 1

1

这两个都不正确:

typedef M<B> Lift<M extends Monad, A, B>(M<A> source, Func1<A, B> map);
typedef Mb Lift<M extends Monad, Ma extends M<A>, A, Mb extends M<B>, B>(Ma source, Func1<A, B> map);

问题是你说 M 是一个类型变量,而类型变量没有类型参数。所以你不能写:

M<A>

这是为什么?简短的回答是 M 的实际值可能是 Monad 的子类,它没有类型参数(或者比 Monad 有更多的类型参数)。

因此,您可以表达的“最佳”类型是:

typedef R Lift<A, B, M extends Monad<A>, R extends Monad<B>>(M source, Func1<A, B> map);

我的建议是不要尝试这个。这将更容易使用:

typedef Monad<B> Lift<A, B>(Monad<A> source, Func1<A, B> map);

请注意,Dart 中的类型规则非常宽松,这将允许您使用 Monad 的任何子类。

于 2013-04-02T14:38:13.213 回答