Scala ADT 类型不匹配

迈克·斯林

我对定义endState. 这是代码:

import java.util.UUID

object Evaluation {
  def default: Evaluation[Unit, Unit] = new Evaluation[Unit, Unit](identity)
}

case class Evaluation[From, +To](evaluate: (From) => To)

object FSMLike {
  val uuidEmpty: UUID = new UUID(0L, 0L)

  val endState: Evaluation[Unit, FSMLike[Nothing]] = new Evaluation(() => FSMEmpty)

  lazy val stop: FSMEntry[Unit, Unit, Nothing] = FSMEntry(uuidEmpty, Evaluation.default, endState)

  def apply[From1, From2, To](
    action: Evaluation[From1, Unit],
    nextState: Evaluation[From2, FSMLike[To]]
  ): (UUID, FSMLike[To]) = {
    val uuid = UUID.randomUUID
    uuid -> FSMEntry(uuid, action, nextState)
  }
}

sealed trait FSMLike[+A]

case object FSMEmpty extends FSMLike[Nothing]

case class FSMEntry[From1, From2, +To](
  id: UUID,
  action: Evaluation[From1, Unit],
  nextState: Evaluation[From2, FSMLike[To]]
) extends FSMLike[To] {
  def transition(arg1: From1, arg2: From2): FSMLike[To] = {
    action.evaluate(arg1)
    nextState.evaluate(arg2)
  }

  override def toString: String = s"^$id^"
}

这是错误:

Error:(14, 72) type mismatch;
 found   : () => FSMEmpty.type (with underlying type () => FSMEmpty.type)
 required: Unit => FSMLike[Nothing]
  val endState: Evaluation[Unit, FSMLike[Nothing]] = new Evaluation(() => FSMEmpty)
阿列克谢·罗曼诺夫

您正在尝试传递() => FSMEmpty一个没有参数的函数,其中需要一个具有一个类型参数的函数Unit当然,当您()用作表达式时,它是 type 的唯一值Unit,但 的左侧=>不是表达式。

你应该写_ => FSMEmpty{ case () => FSMEmpty }我认为也可以,但使用它没有多大意义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章