我在为熟悉Haskell之后学习Scala的练习编写游戏代码。我从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)
我试图编写一个懒惰的,有条件的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
}
使这个功能变得干脆和懒惰有什么必要?
编辑:我已经用谷歌搜索了答案,但没有找到任何使用的文章,所以请帮我解决这个问题。
答案 0 :(得分:2)
这是一个curried函数示例:
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)
不会运行。
HTH。
答案 1 :(得分:0)
def addToPlayer(p: PlayerCircle)(c: Circle): PlayerCircle = c match {
case AICircle(_, _, wr) => p.copy(p.x, p.y, p.r + wr)
case _ => p
}