5

scalaz では、endo関数 inFunction1Opsは次のように実装されます。

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

と同じように動作するEndo.endoself... as を単純に取るだけでなく、関数の本体でなぜ興味があります。Endo.endo(self)Endo.endo(t=> ev(self(t)))

これが私の模倣の実装であり、2つの間に違いはありません。私は何か見落としてますか?

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 

また、最初の実装では実行時にオーバーヘッドが追加されませんか?

4

1 に答える 1

4

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 が設定されていないため、例はコンパイルされます。

于 2013-03-06T00:00:49.263 に答える