2012-10-23 151 views
0

我想要這個匹配兩個案例類的比較函數,但它有點冗長。在Scala中匹配的案例類別

葉子總是在列表中排序的順序。

abstract class CodeTree 
    case class Fork(left: CodeTree, right: CodeTree, chars: List[Char], weight: Int) extends CodeTree 
    case class Leaf(char: Char, weight: Int) extends CodeTree 

    def sortCodeTreeFun(x: CodeTree, y: CodeTree) = { 
    (x, y) match { 
     case (x1: Leaf, y1: Leaf) => true 
     case (x1: Fork, y1: Leaf) => x1.weight < y1.weight 
     case (x1: Leaf, y1: Fork) => x1.weight < y1.weight 
     case (x1: Fork, y1: Fork) => x1.weight < y1.weight 
    } 
    } 

我試圖修改碼樹的構造是:

abstract class CodeTree(weight: Int) 

所以,我可以直接比較X和Y,但是編譯器說:

「沒有足夠的論據構造碼樹:(weight:Int)patmat.Huffman.CodeTree「

有沒有另一種方法縮短sortCodeTreeFun方法?

+5

這是從FP Scala的功課在線課程 – smk

+0

純違反榮譽規章4「在斯卡拉功能編程」 當然導體「我不會試圖不誠實地改進我的代碼....「 –

+0

我已經完成了任務並獲得了10/10。在嘗試提高對Scala語言的理解時,看不到任何不光彩的東西。 – Zotov

回答

2

你可以簡單地說:

def sortCodeTreeFun(x: CodeTree, y: CodeTree) = { 
    (x, y) match { 
    case (_: Leaf, _: Leaf)   => true 
    case (x1: CodeTree, y1: CodeTree) => x1.weight < y1.weight 
    } 
} 

,並定義抽象類碼樹爲

abstract class CodeTree { 
    def weight: Int 
} 

的原因錯誤是,當你擴展該帶一個參數的類,你需要提供參數。因此,對於

abstract class CodeTree(weight: Int) 

你需要把它延伸

case class Fork(left: CodeTree, right: CodeTree, chars: List[Char], weight: Int) extends CodeTree(weight) 

這就是你得到的錯誤是說:

"not enough arguments for constructor CodeTree: (weight: Int)" 

那是因爲你沒有提供所需參數擴展CodeTree時爲weight

雖然這種方法的問題是重量不是CodeTree的成員,因此無法從CodeTree類型的實例訪問。也就是說,如果你這樣做:

scala> Fork(...).asInstanceOf[CodeTree].weight 
<console>:11: error: value weight is not a member of CodeTree 

所以,在你的模式匹配,你將無法做到x1.weight因爲X1的類型是CodeTreeCodeTree沒有一個weight

+0

太好了,謝謝!但是,請你解釋我爲什麼會收到錯誤? – Zotov

+0

因爲您在擴展CodeTree時沒有提供權重。 –

+0

@維克多克拉格說什麼。編輯包括錯誤的原因。雖然可能會有點囉嗦:)。 – rjsvaljean