Написание ленивых карри в скале с несколькими параметрами

Я пишу код для игры в качестве упражнения для изучения Scala после знакомства с Haskell. Я начал с ADT следующим образом:

sealed class Circle(x: Double, y: Double, r: Double)

case class PlayerCircle (x: Double, y: Double, r: Double) extends Circle(x, y, r)

case class AICircle (x: Double, y: Double, r: Double) extends Circle(x, y, r)

Я пытаюсь написать ленивый, curried val, который делает следующее (в псевдокоде на Haskell):

addToPlayer :: PlayerCircle -> Circle -> PlayerCircle
addToPlayer (PlayerCircle px py pr) (AICircle _ _ cr) = PlayerCircle px py (pr + cr)
addToPlayer player _ = player

У меня есть следующее:

def addToPlayer (wcircle : Circle) : PlayerCircle = wcircle match {
    case AICircle (_, _, wr) => copy(this.x, this.y, this.r + wr)
    case _ => this
}

Что нужно, чтобы сделать эту функцию карри и ленивой?

Изменить: я гуглил на ответ, но не нашел ни одной статьи использования, поэтому, пожалуйста, помогите мне с этим.

2 ответа

Вот пример функции с карри:

def addToPlayer(c: Circle, p: Player) = ... actual code...
def addToPlayer(c: Circle) = p: Player => addToPlayer(c, p)

Тогда вы можете сделать это:

val partial = addToPlayer(c)
val complete = partial(p)

Это лениво, потому что addToPlayer(c, p) не запускается, пока не заданы оба параметра.

НТН.

Может быть так

def addToPlayer(p: PlayerCircle)(c: Circle): PlayerCircle = c match {
  case AICircle(_, _, wr) => p.copy(p.x, p.y, p.r + wr)
  case _ => p
}
Другие вопросы по тегам