2010-02-16 64 views
13

我有這樣如何使用可變參數大小寫類執行模式匹配?

abstract class Shape 
case class Rectangle(width: Int, height: Int) extends Shape 
case class Location(x: Int, y: Int, shape: Shape) extends Shape 
case class Circle(radius: Int) extends Shape 
case class Group(shape: Shape*) extends Shape 

其中基本上集團是形狀的陣列的一組的情況下的類。我需要爲矩形,圓形和位置計算尺寸 的尺寸方法定義它的直接返回值。但是我對團隊有困難。

object size extends Shape{ 
    def size(s: Any) : Int = s match { 
    case Rectangle(x,y) => 1 
    case Group // how to do it? Also having case Group(shape : Shape*) gives an error 
    case Circle(r) => 1  
    case Location(x,y,shape) => 1 
    } 
} 

我知道組​​我需要使用地圖和摺疊左,但我真的不能爲它創建一個邏輯。 謝謝

回答

8

可變參數模式匹配的語法有點strange

def size(s: Shape) : Int = s match{ 
    case Rectangle(x,y) => 1 
    case Circle(r) => 1 
    case Location(x,y,shape) => 1 
    case Group(shapes @ _*) => (0 /: shapes) { _ + size(_) } 
} 

注意,在最後一行,你總結了所有子shapes的大小使用/: -notation的褶皺0開始。


folds如何工作:摺疊使用給定函數累積序列的元素。

因此,爲了計算列表的總和,我們會寫(哈斯克爾式)

fold (\total element -> total + element) 0 list 

這將列表中的所有元素結合了從0開始給定的加法函數(因此計算總和)。

在Scala中,我們可以寫出這樣說:

(0 /: list) { (total, element) => total + element } 

可以簡化爲

(0 /: list) { _ + _ } 
+0

這不包括重疊。這很重要嗎? – PanCrit 2010-02-16 17:53:32

+0

可否請你解釋我的最後一行如何工作,它的方式太奇怪了????? case組(shapes @ _ *)=>(0 /:shapes){_ + size(_)} – tom 2010-02-16 17:59:35

+0

@PanCrit:我不是那麼流利的Scala - 你能解釋一下* overlap重要嗎? ? – Dario 2010-02-16 18:13:12

17

任何一項都將正常工作,第二個可能是首選,如果這一點都不奇怪,在第一一目瞭然。請參閱Scala Reference中的8.1.9模式序列。

case g: Group => g.shape.map(size(_)).sum 

case Group(ss @ _*) => ss.map(size(_)).sum 

這是使用Scala 2.8。 sum可能無法在舊版本上使用。

+0

這不包括重疊。這很重要嗎? – PanCrit 2010-02-16 17:52:51

+5

我的假設是,問題是關於Scala中的模式匹配而不是幾何。 – retronym 2010-02-16 19:30:08

2

第一步是弄清楚你的意思。兩個最明顯的選擇是所有形狀覆蓋的總面積以及包含它們的最小矩形。如果爲圓圈返回實際區域,那麼他們可能必須與實際區域一起去。

有沒有封閉的方式來回答這個問題。我可能會考慮在最小包圍矩形處擲出一千個隨機飛鏢,並將該面積估計爲飛鏢擊中佔用點的百分比。估計是可以接受的迴應嗎?

你保證所有的形狀都是圓形和長方形嗎?您可能可以拼湊出適合他們的解決方案。如果形狀可能會進一步延伸,那麼這將不起作用。

0

情況克:組=> g.shape.map(大小(_))總結

殼體組(SS @*)=> ss.map(大小())。總和

這兩個給出誤差值之和不爲SEQ的成員[詮釋]
然而此OEN工作
情況集團(形狀@ _ *)=>(0 /:形狀){_ +大小(_)

+2

請不要發佈問題作爲答案,但編輯您的問題! – Dario 2010-02-16 18:08:42

1

對於位置大小應鑽到得到尺寸,因爲形狀可以導致更高的計數

情況下的位置(X,Y,形狀)=>大小(形狀)

組即如果尺寸是形狀中的形狀數量

相關問題