Scala中更好的函数输入/输出参数样式

时间:2019-05-22 22:34:01

标签: scala functional-programming

到目前为止,这段代码可以正常工作,但是我不喜欢这样的元组,这会导致使用_.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 个答案:

答案 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)],可以用别名类型或可以通过重构为案例类来获得更好的命名效果。