将curried函数的args替换为Units

时间:2011-12-29 23:51:51

标签: 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], 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)
}

修改

抱歉,有一个错误。展平功能实际上如下所示:

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

所以我认为它不会比这简单。

1 个答案:

答案 0 :(得分:1)

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

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

哪个看起来不错?