Function 替换curried函数';s参数表示单位

Function 替换curried函数';s参数表示单位,function,scala,currying,unit-type,Function,Scala,Currying,Unit Type,(无效) 将curried函数中的参数部分替换为单位的最佳方法是: 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]

无效

将curried函数中的参数部分替换为单位的最佳方法是:

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 = ???
因此,需要从左到右将curried
Function1
转换为curried
Function0

以下方法可行,但看起来相当笨拙:

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

对不起,有个错误。展平函数实际上如下所示:

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

因此,我认为它再简单不过了。

只需将各种VAL直接替换为一个表达式即可:

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

在我看来,哪个很好?

将各种VAL直接替换为一个表达式即可得到:

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

对我来说哪个看起来不错?

对不起,我应该说得更清楚:
e.apply
必须在第一个应用程序中调用;这是为了“缓存”它并使它在多个反应器之间保持一致,在第二个应用程序中,它们可以自由地对任何数据流变量进行操作。问题的表述也有一个错误:-(对不起,我应该说得更清楚:
e.apply
必须在第一个应用程序中调用;这是为了“缓存”它并使它在多个反应器中保持一致,而在第二个应用程序中,它们可以自由地对任何数据流变量进行操作。问题公式中还有一个错误:-(