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 に答える