2011-12-29 35 views
1

无效代咖喱函数的args作为单位

什么是最好的方式,在单位咖喱功能部分替代参数:

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

就直接代入您的各种丘壑到一个单一的表达式给出:

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

这看起来好像没什么问题?

+0

对不起,我应该说得更清楚一点:'e.apply'必须在第一个应用程序中调用;这是为了“缓存”它并使其在多个反应器中保持一致,而在第二个应用程序中,它们可以自由地回应任何数据流变量。问题表述中也存在一个错误:-( – 2011-12-30 09:53:23