2017-01-15 10 views
2

example from the the Akka HTTP docucumentation показывает, что вы можете использовать метод map на Directives, чтобы преобразовать их значение так, как вы ожидаете.Почему «карта» в директиве иногда обертывает результат в кортеж?

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.