2014-02-10 89 views
0

我有以下代碼:減少樣板與函數組合

def a = f(aa) 
def b = f(bb) 
def c = f(cc) 
def d = f(dd) 

是否有解決方案,除去樣板,即顯式調用f

+1

我很想知道爲什麼你認爲它是樣板。你怎麼可能以更簡潔或更清晰的方式寫這個?很快人們會發現'def'關鍵字也是樣板文件! :-P –

+0

因爲相同的模式(呼籲f)多次出現,但我同意,這只是一些樣板,也許不可能做得更好。 –

回答

6

你可以用標準庫做這樣的事情:

val List(a,b,c,d) = List(aa,bb,cc,dd).map(f) 

它使用模式匹配來分配左側的值,如果兩個Lists的長度不相同,則在運行時會失敗。

Scalaz具有使用元組,以確保在左,右值的數量是多類型安全的選項相同(在編譯時檢查):

import scalaz._, Scalaz._ 
val (a,b,c,d) = (aa,bb,cc,dd).map(f) 
+0

'val List(a,b,c,d)=列表(aa,bb,cc,dd).map(f)'不是leazy解決方案all a,b,c,..將在同一時間執行,但是'def a = f(aa)'和'def b = f(bb)'將在它會調用的時刻執行。 – Yuriy

+0

當我用scalaz解決方案替換標準解決方案時,出現了一個編譯錯誤:[error] conf/routes:49:適用於方法的參數不夠:(n:Int)models.EventType.Value在特徵LinearSeqOptimized中。 [錯誤]未指定的值參數n。 –

+0

Yury:是的,如果'f'有副作用,這將是一個問題。我想不出任何類似的東西。 Yann:我沒有足夠的上下文來診斷scalaz解決方案的問題。 –

1

我們可以隱: http://docs.scala-lang.org/overviews/core/implicit-classes.html

val aa: Int = 1 

// Let's say that your function f returns instance of C 
def f(x: Int): C = ??? 

implicit class C(in: Int) { 
    // Do whatever you need here ... 
} 

def a: C = aa 
+0

aa實際上是一個函數,這裏是f的定義:'def f [A:Reads,B:Writes](g:A => B)' –