5

В scalaz, то endo функция Function1Ops реализуется следующим образом:не понимают функцию scalaz эндо

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

Мне интересно, почему в теле Endo.endo функции, а не просто взяв себя ... как 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 представляет собой функцию T => R, которая не соответствует требованию Endo.

Вы могли бы в теории бросить T => R к T => T но параметр ev создан, поэтому вам не нужно отбрасывать и случайно сделать ошибку, которая T => R не равна T => T.

Они, однако, могли бы написать так:

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

Ваши примеры компиляции, потому что ReturnType не установлен.

+0

спасибо большое. Я пропустил с учетом возвращаемого типа. – chenhry

Смежные вопросы