Написание ленивых карри в скале с несколькими параметрами
Я пишу код для игры в качестве упражнения для изучения 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
}