2016-08-02 14 views
4

私は形質がFoo[A, B]であると仮定します。型パラメータの型パラメータをScalaのパラメータ化されたクラスに伝播することはできますか?

私はFooでパラメータ化クラスBarを定義し、Bar方法でFoo型パラメータを再利用したいです。 (このスニペットがコンパイルされません)、以下に示すような何か:

trait Bar[Foo[A, B]] { 
    def doSmth[C](A => C): C 
} 

は似た何かを達成する方法はありますし、まだBar宣言の中で1つだけの型パラメータを持っていますか?

p.s.説明されたものの正しい用語を誰かが示唆することができれば、それは素晴らしいことかもしれません。

+0

'Foo'が特性である場合、それを型引数の中に含める目的は何ですか?ユースケースは何ですか? –

+0

@ m-z:私は 'Bar'に基づいて計算チェーンを作ろうとしています(私は' Monad'と呼ぶことができるかどうかは分かりません)。 'Foo [A、B]'は現在の計算ステップを表し、 'Function1'のようにsmthになります。私は実際に 'Bar'部分がその型の計算コンテキストを運ぶのが好きです。 – Roman

+0

'バー'の 'Foo'について知りたいですか?または型パラメータだけ?つまり、複数の型パラメータを持っていれば 'Bar [A、B]'または 'Foo [A、B、F [A、B]'でしょうか? –

答えて

1

わかりませんが、これはあなたが行きたいところの近くです。

trait Foo[A,B] 
trait Bar[A] { self: Foo[A,_] => 
    def doSmth[C](atoc: A => C): C 
} 

または、タイプエイリアスを使用します。

trait Foo[A,B] {type FooA = A} 
trait Bar { self: Foo[_,_] => 
    def doSmth[C](atoc: FooA => C): C 
} 

これは、あなたがミックスの中でBarを持っている場合Fooが必要であることを意味します。

1

#演算子を使用すると、クラスまたは特性の型メンバーにアクセスできます。

trait M { 
    type A 
    type B 
    } 

    class F[X,Y] extends M { 
    type A = X 
    type B = Y 
    } 

    trait Bar[F] { 
    def doSmth[C](x: M#A => M#B): C 
    } 
関連する問題