2015-06-19 66 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 
}