2012-06-01 4 views
3

사용자가 여러 프로세서를 함께 연결할 수있는 시스템을 만들려고합니다. 내가 가지고있는 어려움은 각각의 프로세서가 실제로 염려하는 두 비트의 정보를 가지기 때문에 이것들을 유형 안전 방식으로 처리하기를 원합니다. 나는이 문제에 내려 삶은했습니다일반적으로 스칼라로 특성을 인스턴스화합니다.

감안할 때 : 나는 4 개 맛 함께 두 가족의 요소를 결합 할 수 있습니다

//First family of stuff 
trait A { 
    def doA {} 
} 

trait B { 
    def doB {} 
} 

//Second family of stuff 
trait X { 
    def doX {} 
} 

trait Y { 
    def doY {} 
} 

:

var f = new A with X {} 
f.doA 
d.doX 

var g = new A with Y {} 
//... 

우수함. 문제는 각 함수 (doA 등)가 두 가지 유형의 조합을 반환하여 물건을 함께 연결할 수 있기를 원합니다. 기본적으로 내가하고 싶은 : 특성 { ThingThatImMixedInWithLikeXOrY {}와 데프 doThing = { 않는 새 } } 각 프로세서) (1)의 프로세서 2로 알려진 유형을 구성 익명 클래스를 반환해야

) 그것이 혼합 된 타입.

나의 첫번째 찌르기는 제네릭이 같은 것을 사용하는 것이 었습니다 :

  1. 내가 제네릭 클래스를 만들 수 없습니다 : 분명히

    trait A { 
        this : {def makeWithT[TOther]} => 
        def doA = makeWithT[B] 
    } 
    
    trait B { 
        this : {def makeWithT[TOther]} => 
        def doB = makeWithT[A] 
    } 
    
    trait X { 
        this : {def makeWithS[TOther]} => 
        def doX = makeWithT[Y] 
    } 
    
    trait Y { 
        this : {def makeWithS[TOther]} => 
        def doY = makeWithT[Y] 
    } 
    
    class Foo[T, S] extends S with T { 
        def makeWithT[OtherT] = new T with OtherT 
        def makeWithS[OtherT] = new S with OtherT 
    } 
    
    var f = new Foo[A, X] 
    f.doA.doB 
    f.doX.doA 
    f.doX.doY 
    ... 
    

    을, 나는 문제의 카탈로그로 실행했습니다 형식 매개 변수에서 확장됩니다

  2. 제네릭 매개 변수를 통해 내 익명 클래스를 인스턴스화 할 수 없습니다

  3. 내가 이 뭔가를 섞을 때까지 형식을 알지 못하기 때문에 특성에서 함수의 반환 형식을 정의 할 수 없습니다. 이 스칼라에 관해서

나는 멍청한 놈의 비트 해요, 나는 내가 완전히 잘못된 방법으로 이것에 대해 갈거야 느낌을 얻을 어쩌면 내가 implicits과 CanBuildFrom 패턴을 사용한다. 어떤 도움이라도 대단히 감사하겠습니다.

건배

+2

문제를 최소화하고 매우 추상적으로 만들었습니다. 어떤 경우에는 좋은 일이 될 수 있지만, 구체적인 사례와 구체적인 목표를 설명하고 아카이브하려는 목표가 있다면이 특별한 경우에 도움이 될 것이라고 생각합니다. 내가 알 수있는 한,이 질문에서 우리는 아직 알지 못하는 문제에 대한 (깨진) 해결책을 설명하고 있습니다.당신이 우리와 공유한다면, 현재 직면하고있는 문제에 대한 또 다른/더 나은/일하는 해결책을 찾을 수있을 것입니다. – tenshi

+0

OK, 여기갑니다. 나는 문법을 가지고있어서 dataSource.map (...)과 같은 일을 할 수있다. filter (...) 여기서 dataSource는 내 자신의 종류의 스트림이다. 문제는 내가 수행하고 싶은 다른 연산이 변환이 아니라 오히려 계산이 수행되는 방법을 수정 한 것입니다. 예를 들어 datasource.asParallel.filter (...). asSequential을 원할 수 있습니다. 약간 인위적인 예이지만 두 가지 작업 그룹이 있음을 알 수 있습니다. asParallel의 반환 유형은 asSequential 연산을 노출하는 무언가 여야합니다. –

답변

1

스택 프로세서를위한 가장 알려진 해결책은 피할 수없는

abstract override def StackablePass(x:Int) = super.StackablePass(internalPass(x)) 

일부 상용구가 스택 특성

http://www.artima.com/scalazine/articles/stackable_trait_pattern.html

trait StackableRoot { 
    def StackablePass (x:Int) : x 
} 
trait StackableDouble extends StackableRoot { 
    def internalPass (x:Int) = 2*x 
    abstract override def StackablePass(x:Int) = super.StackablePass(internalPass(x)) 
} 
trait StackableIncrement extends StackableRoot { 
    def internalPass (x:Int) = x+1 
    abstract override def StackablePass(x:Int) = super.StackablePass(internalPass(x)) 
} 

에게 있습니다 그것이 requir 할 것이기 때문에 parametrized 특성으로 포장 스칼라가 여러 매개 변수를 사용하여 여러 가지 특성을 여러 번 상속 받음 유명한 유형 삭제로 금지되는 문자

관련 문제