2015-06-19 63 views
1

我正在为一个游戏编写代码,作为在熟悉Haskell之后学习Scala的练习。我开始与ADT如下:使用多个参数编写带有scala的懒惰咖喱

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

你为什么要讨好它,让它懒惰?当你使用一个接受**多个**参数的函数并将其转换为一系列函数,每个函数都有参数时,currying也是。 –

+0

我习惯了Haskell范式,有点儿。这主要是一个学习练习。 –

+0

但你的功能只需要一个参数......你如何期望咖喱它? –

回答

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)不运行,直到这两个参数中给出。

HTH。

0

也许这样

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