Подстановка аргументов карри функции для единиц - PullRequest
1 голос
/ 30 декабря 2011

( недействительный )

Каков наилучший способ частичной замены аргументов в карри функции для Units:

trait Expr[A] { def apply : A }

type Reaction[A] = A => Unit
type TypedReactor[A] = Expr[A] => Reaction[A] // aka Expr[A] => A => Unit
type FlatReactor = () => () => Unit

def flatten[A](e: Expr[A], r: TypedReactor[A]): FlatReactor = ???

Таким образом, карри Function1 необходимо преобразовать слева направо в карри Function0.

Следующее работает, но выглядит довольно неловко:

def flatten[A](e: Expr[A], r: TypedReactor[A]): FlatReactor = () => { 
  val unc = r(e); val eval = e.apply; () => unc(eval)
}

EDIT

Извините, произошла ошибка. Функция сглаживания на самом деле выглядит так:

def flatten[A](e: Expr[A], r: Reaction[A]): FlatReactor = () => { 
  val eval = e.apply; () => r(eval)
}

Так что я не думаю, что это может быть проще, чем это.

1 Ответ

1 голос
/ 30 декабря 2011

Простая подстановка различных значений в одно выражение дает:

def flatten[A](e: Expr[A], r: TypedReactor[A]): FlatReactor =
  () => () => r(e)(e.apply)

Что мне подходит?

...