2017-01-08 1 views
0

아래의 스칼라 컴파일러 오류를 해결하려고합니다. (의사) -Haskell에서Scala에서 메소드 및 하위 유형 다형성 복사

case class CC[E](l:List[E]) 

trait D[E,L<:CC[E]]{ 
    def f(l:L):L = l.copy(l=List()) // does not compile: "found CC[E], required: L" 
} 

(하위 입력하지 않고) 등이 될 것이다 일 :

data CC = CC {l::[e]} 
'makeLens CC 
f l = l .~ _e [] 

은 현재 내가 ScalaZ, 볼품와 외알 안경으로 찾고 있어요.

언뜻보기에 단안은 의심 스럽지만 (의심 스럽지만) 내 직감이 잘못되면 나를 잘못 판단하십시오.

ScalaZ + 모양이 맞지 않을 수도 있습니다. probably 작동 방법을 잘 모르겠습니다.

1) Scala에서 이것을 해결하는 가장 쉬운 방법은 무엇입니까?

2) ScalaZ 자체로 충분합니까? 아니면 쉐필리스만으로도 충분합니까? 아니면 두 가지 필수품의 조합입니까? 아니면 다른 방법일까요?

+0

흠이 대답 http://www.cakesolutions.net/teamblogs/copying-sealed-trait-instances-a-journey-through 것 같다 -generic-programming-and-shapeless – jhegedus

+0

이것은 관련이있다 : http://stackoverflow.com/a/41000237/1374461 –

+0

흥미 롭다, 팁 주셔서 감사합니다 @ Jasper-M – jhegedus

답변

1

당신은 Monocle로 다음을 수행 할 수 :

import monocle.macros.Lenses 

@Lenses 
case class CC[E](l:List[E]) 

object D { 
    def f[E](cc: CC[E]): CC[E] = CC.l.set(List())(cc) 
} 
+0

고마워! 매우 흥미로운 ! 'cc'가'CC [E]'의 부속 유형이라면이 방법이 효과가 있습니까? 그렇게 보이지만 확실하지 않습니다. 이 경우 Monocle은 하위 유형의 필드도 복사 할 수 있어야합니다. Monocle이 그렇게 할 수 있습니까? 예를 들어'DD가 CC [E]를 확장하면'val d : String' 필드를 가지면'f'는'd'도 복사해야하지만 CC를위한 렌즈를 만들 때 Monocle은 'd'. 그래서 어떻게 작동 할 수 있을지 궁금해합니다. – jhegedus

+0

네,'렌즈 [CC [E],리스트 [E]]'를 가지고 있다면'DD extends CC [E]'타입의 값으로 사용할 수 있습니다. 그러나'Lens'를 생성하는 데'@Lenses'를 사용할 수 없습니다. 왜냐하면이 클래스는 대소 문자 클래스에만 적용되며 확장 할 수 없기 때문입니다. –