Как я могу объединить плавные интерфейсы с функциональным стилем в Scala?

Я читал о подходе OO «свободный интерфейс» в Java , JavaScript и Scala , и мне нравится его внешний вид, но мы изо всех сил пытались понять, как согласовать его с более основанным на типах / функциональным подходом в Scala.

Чтобы дать очень конкретный пример того, что я имею в виду: я написал клиент API, который можно вызывать следующим образом:

val response = MyTargetApi.get("orders", 24)

Возвращаемое значение из get () - это Tuple3 тип, называемый RestfulResponse , как определено в моем объекте пакета :

// 1. Return code
// 2. Response headers
// 2. Response body (Option)
type RestfulResponse = (Int, List[String], Option[String])

Это отлично работает - и я действительно не хочу жертвовать функциональной простотой возвращаемого значения кортежа - но я хотел бы расширить библиотеку различными вызовами «беглых» методов, возможно, примерно так:

val response = MyTargetApi.get("customers", 55).throwIfError()
// Or perhaps:
MyTargetApi.get("orders", 24).debugPrint(verbose=true)

Как я могу объединить функциональную простоту get () , возвращающую типизированный кортеж (или аналогичный) с возможностью добавить к моему API дополнительные «плавные» возможности?

6
задан Community 23 May 2017 в 11:46
поделиться