5

을 이해하지 못하고, Function1Opsendo 기능은이 방법으로 구현됩니다 Endo.endo 함수의 본문에, 그냥 단순히 자신을 복용하는 이유가 scalaz 엔도 기능을 scalaz에서

def endo(implicit ev: R =:= T): Endo[T] = 
    Endo.endo(t => ev(self(t))) 

내가 호기심을 ... Endo.endo(self)으로, 이는 Endo.endo(t=> ev(self(t)))과 동일하게 동작합니다.

여기에 제 모방 구현이 있는데 두 경우에는 차이가 없습니다. 내가 뭐 놓친 거 없니?

def endo[R, T](f: R => T)(implicit ev: T =:= R) = (x: R)=> ev(f(x)) 
def endo2[R, T](f: R => T)(implicit ev: T =:= R) = f 

게다가 첫 번째 구현은 런타임에 오버 헤드를 추가하지 않습니까?

+0

이런 종류의 질문을하는 가장 좋은 곳은 https://groups.google.com/forum/?fromgroups#!forum/scalaz 메일 링리스트입니다. #[email protected]도 이런 종류의 질문을 제기 할 수있는 적절한 곳입니다. github 레포 (https://github.com/scalaz/scalaz)로 끌어 오기 요청을 보낼 수도 있습니다. – folone

답변

3

Endo.endo 함수는 A => A이 필요합니다. self 값은 Endo 요구 사항을 준수하지 않는 T => R 함수입니다. 이론

당신은 할 수는 T => TT => R 캐스트하지만 캐스팅 실수로 T => RT => T 같지 않은 것을 실수를 할 필요가 없습니다 있도록 ev 매개 변수가 생성됩니다.

은 그러나 그들은 이런 식으로 작성했습니다 수있는 다음 returntype의이 설정되어 있기 때문에

def endo(implicit ev: R =:= T): Endo[T] = 
    Endo.endo(self andThen ev) 

귀하의 예를 컴파일합니다.

+0

고맙습니다. 나는 반환 유형을 고려하지 않았다. – chenhry