스칼라를 실험하고 형식 유추 문제로 약간 혼란스러워합니다. 컴파일러 오류에스칼라의 일반 카레 메서드에 대한 유추 형식
val hist = SequentialHistory(Seq.empty[Event])
//hist: SequentialHistory[Event] = SequentialHistory(List())
val histWithEvent = addEvent(SampleEvent("Does not compile"))(hist)
//error
결과 : 형식 유추가 제대로 컴파일 작동하지 않는 이유
case class SequentialHistory[+E](events: Seq[E])
trait Event
case class SampleEvent(value: String) extends Event
def addEvent[E, E2 >: E](event: E)(history:SequentialHistory[E2]):
SequentialHistory[E2] = history.copy(events = event +: history.events)
싶습니다
이해하기 :
성공적으로 컴파일 아래의 정의를 감안할 때
Error:(21, 62) type mismatch;
found : SequentialHistory[Event]
required: SequentialHistory[SampleEvent]
addEvent(SampleEvent("Does not compile"))(hist)
^
그러나 내가 addEvent
방법 정의에 매개 변수 목록을 교환하는 경우 : 문제를 해결할 것
def addEvent2[E, E2 >: E](history: SequentialHistory[E2])(event: E):
SequentialHistory[E2] = history.copy(events = event +: history.events)
는, 종류가 올바르게 추론 아래 조각은 컴파일 :
val hist2 = SequentialHistory(Seq.empty[Event])
//hist2: SequentialHistory[Event] = SequentialHistory(List())
val histWithEvent2 = addEvent2(hist)(SampleEvent("Compiles"))
//histWithEvent1: SequentialHistory[Event] =
// SequentialHistory(List(SampleEvent1(Compiles)))
스칼라 컴파일러가 추론은`t 왜 유형을 올바르게 addEvent
의 첫 번째 버전에 있습니까?
기술적으로 여러 매개 변수 목록과 currying (스칼라 문서가 정의하는 방식이 아닌 고전적)은 두 가지 개념입니다. 잠재적 η 확장이 유형 유추에 영향을 미친다고 말하는 겁니까? 이상 할거야. –
모든 매개 변수가 하나의 매개 변수 목록에있는 경우 - 형식 유추가 다르게 동작합니다 ("병렬"로 유추 함). 하나의 매개 변수 목록에서도 여러 매개 변수에 부분 적용이 가능하므로 이유가없는 것 같습니다. – dk14