Цепная функция в Scala с использованием точечной нотации - PullRequest
0 голосов
/ 21 февраля 2019

Пока что единственный родной метод объединения функций в Scala, о котором я знаю, это использование andThen / compose.Это делает работу, но все еще выглядит очень неуклюжим.Например, если у меня есть 3 функции для применения к значению (f1 (f2 (f3 (value)))), я должен сделать что-то вроде этого:

(f1 _ andThen f2 andThen f3)(value)

Проблемы становятся еще хуже, когда цепочкадлиннее и функции требуют более 1 параметра.F # очень элегантно решает эту головоломку с помощью оператора '|>', но этот подход не очень хорошо работает в Scala, поскольку язык во многом опирается на точечную нотацию, а каррирование необязательно.

Так что вопрос в том,Можно ли сделать что-то подобное в Scala:

def addNumber(i: Int, s: String) = s + i
def doubleString(s: String) = (s + s, (s + s).length)
def trimString(i: (String, Int)) = i._1.substring(0, i._2-1)

addNumber(1,"Hello").doubleString.trimString

Другими словами, можем ли мы объединить функции в цепочку при условии, что они имеют разные возвращаемые типы / аргументы.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Начиная с Scala 2.13 вы можете использовать оператор pipe:

import scala.util.chaining._

// def addNumber(i: Int, s: String) = s + i
// def doubleString(s: String) = (s + s, (s + s).length)
// def trimString(i: (String, Int)) = i._1.substring(0, i._2-1)
"Hello".pipe(addNumber(1, _)).pipe(doubleString).pipe(trimString)
// "Hello1Hello"
0 голосов
/ 22 февраля 2019

Вы можете поэкспериментировать со Scalaz:

  import scalaz._
  import Scalaz._

  def addNumber(i: Int, s: String) = s + i
  def doubleString(s: String) = (s + s, (s + s).length)
  def trimString(i: (String, Int)) = i._1.substring(0, i._2-1)

  def main(args: Array[String]) : Unit  =
    println(addNumber(2, "44") |> doubleString |> trimString)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...