Лучший функциональный стиль аргументов ввода / вывода в Scala - PullRequest
0 голосов
/ 23 мая 2019

Этот код пока работает отлично, но мне не нравятся кортежи везде, подобные этому, что приводит к использованию _.1 и _2 и т. Д., Что менее выразительно. Я могу реализовать классы-обертки, которые имеют более выразительные имена. Есть ли лучший подход?

trait DrawingSteps {

  def prompt(savedCommands: List[Command]): IO[(List[Command], Unit)]
  def read(savedCommands: List[Command]): IO[(List[Command], String)]
  def parseAndAppend(in: (List[Command], String)): List[Command]
  def invoke(savedCommands: List[Command]): IO[(List[Command], Unit)]

  def drawingProgram(savedCommands:List[Command] = List()):IO[(List[Command],Unit)] = for {
    t <- prompt(savedCommands)
    rawCommand <- read(t._1)
    commands = parseAndAppend(rawCommand)
    output <- invoke(commands)
  } yield output._1  match {
    case (_:CommandIsQuit)::_  => FP.exit(output._1).run
    case _ => drawingProgram(output._1).run
  }
}

1 Ответ

1 голос
/ 23 мая 2019

Вы всегда можете использовать сопоставление с образцом, чтобы деконструировать классы / кортежи case и давать значимые имена вместо использования элементов кортежа (_1).Вот пример:

trait DrawingSteps {

  def prompt(savedCommands: List[Command]): IO[(List[Command], Unit)]
  def read(savedCommands: List[Command]): IO[(List[Command], String)]
  def parseAndAppend(in: (List[Command], String)): List[Command]
  def invoke(savedCommands: List[Command]): IO[(List[Command], Unit)]

  def drawingProgram(savedCommands:List[Command] = List()):IO[(List[Command],Unit)] = for {
    (inCmd, _) <- prompt(savedCommands)
    rawCommand <- read(inCmd)
    commands = parseAndAppend(rawCommand)
    (outCmd, _) <- invoke(commands)
  } yield outCmd match {
    case (_:CommandIsQuit)::_  => FP.exit(outCmd).run
    case _ => drawingProgram(outCmd).run
  }
}

Я полагаю, вы могли бы заменить кортежи HLists, если обнаружите, что у вас много кортежей с арностью больше 2. Глядя на ваш код, вы получаете множество повторяющихся типов возврата, таких как IO[(List[Command], Unit)] который может быть объявлен с псевдонимом типа или может быть преобразован в класс case для еще лучшего именования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...