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