2012-10-23 5 views
0

두 개의 사례 클래스와 일치하는 비교 함수를 원하지만 약간 자세한 정보가 필요합니다.스칼라에서 일치하는 사례 클래스

잎은 항상 목록에서 정렬 된 순서입니다.

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

내가 할 CodeTree 생성자를 수정하려고 : 내가 직접 x와 y를 비교할 수 있도록

abstract class CodeTree(weight: Int) 

하지만 컴파일러는 말한다 : 생성자 CodeTree에 대한

"충분한 인수 : (무게 : Int) patmat.Huffman.CodeTree "

다른 방법이 있습니까? sortCodeTreeFun 메서드를 줄이십니까?

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 
} 

로 추상 클래스 CodeTree를 정의

+5

이 영광 코드 4의 온라인 과정 – smk

+0

순수한 위반 "스칼라의 기능 프로그래밍 "물론 도체와 스칼라의 FP에서 숙제 사용할 수 있습니다 나는 부정직하게 코드를 향상 시키려고 노력하지 않을 것이다 .... " –

+0

나는 이미 과제를 완료하고 10/10를 얻었다. 스칼라 언어에 대한 나의 이해를 높이기 위해 불명예스러운 것을 보지 마라. – Zotov

답변

2

당신은 단순히 말할 수 매개 변수. 그래서 당신은 당신이지고 있었다 오류가 한 말의 그

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

로 확장 할 필요가

abstract class CodeTree(weight: Int) 

을 위해 :

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

당신이 필요한 인수를 제공하지 않았기 때문에 그것은이었다 CodeTree를 확장 할 때 weight.

그러나이 방법의 문제점은 가중치가 CodeTree의 멤버가 아니므로 CodeTree 유형의 인스턴스에서 액세스 할 수 없다는 점입니다. 당신이 한 경우 즉, 말을하는 것입니다 : X1의 유형이 CodeTreeCodeTreeweight이없는 때문에

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

그래서, 당신의 패턴 일치, 당신은 x1.weight을 할 수 없을 것입니다. 당신이 codetrees 같은 요소를 정렬 할 경우

+0

정말 고마워! 하지만 내가 왜 내가 실수를하고 있는지 설명해 주시겠습니까? – Zotov

+0

확장 할 때 CodeTree에 가중치를 제공하지 않았기 때문입니다. –

+0

@ 빅터 클락이 말한 바. 오류의 원인을 포함하도록 수정되었습니다. 그래도 조금 길어질 수도 있습니다 :). – rjsvaljean

관련 문제