到目前为止,这段代码可以正常工作,但是我不喜欢这样的元组,这会导致使用_.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
}
}
答案 0 :(得分:1)
您始终可以使用模式匹配来解构案例类/元组并给出有意义的名称,而不是使用元组元素(_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
}
}
我想如果发现自己有很多Arity大于2的元组,则可以用HLists替换元组。在代码中,您有很多重复的返回类型,例如IO[(List[Command], Unit)]
,可以用别名类型或可以通过重构为案例类来获得更好的命名效果。