使用多个参数在scala中写入懒惰的curried

时间:2015-06-19 22:37:54

标签: scala haskell lazy-evaluation currying

我在为熟悉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
}

使这个功能变得干脆和懒惰有什么必要?

编辑:我已经用谷歌搜索了答案,但没有找到任何使用的文章,所以请帮我解决这个问题。

2 个答案:

答案 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
}