2017-01-15 7 views
2

次のexample from the the Akka HTTP docucumentationは、Directivesmapメソッドを使用して、期待どおりに値を変換できることを示しています。私は私自身の例でこれを利用しようとすると、なぜディレクティブ上の `map`は結果をタプルでラップするのですか?

val textParam: Directive1[String] = 
    parameter("text".as[String]) 

val lengthDirective: Directive1[Int] = 
    textParam.map(text => text.length) 

はしかし、私が期待されるタイプのTuple1の指示ではなく、期待されるタイプ自体のディレクティブを取得します。たとえば:

val stringOpsDirective: Directive[Tuple1[StringOps]] = 
    textParam.map(text => augmentString(text)) 

私はmapが暗黙のTuplerパラメータを取りますが、実装を見ると形質の見つけることができる、私はすべてがTupleに包まれていませんどのように表示されていないことがわかります。

答えて

1

マップの使用では、例で使用されていたよりも微妙に異なるが、同等の戻り値の型が宣言されました。この例では、 '指令'を返すタイプの '指令'を返します。

あなたがDirective1を利用した場合、あなたの例では、ドキュメントと同様の形式をとります。

val stringOpsDirective: Directive1[StringOps] = 
    textParam.map(text => augmentString(text)) 

以下に定義するDirective1[_]Directive[Tuple1[_]]の別名であるので、これは動作します。他に

type Directive1[T] = Directive[Tuple1[T]] 

あなたが正しいと言いましたが、すべてDirectiveはパラメトリックにTupleの一種にタイプされています。ただし、タイプDirective1を使用して、Tuple1の場合、その事実をいくらか隠すことができます。

関連する問題