Вы всегда можете использовать сопоставление с образцом, чтобы деконструировать классы / кортежи 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 для еще лучшего именования.