2011-12-29 32 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