2013-09-23 163 views
0

所以我根據我讀過我已經得到這種形式討好下來:我該如何在斯卡拉咖喱這個功能?

def arithmetic_iter(op: (Int, Int) => Int, f: Int => Int, base: Int)(a: Int, b: Int): Int = { 
    def iter(a: Int, base: Int): Int = 
     if (a > b) base 
     else iter(a + 1, op(base, f(a))) 

    iter(a, base) 
    } 

然而,我想要做這樣的事情:

def route(m:Message) = { 
    (e: Endpoint) => e.send(m) 
} 

通過上面的功能。所以我想出了這個數字:

def arithmetic_iter_lambda(op: (Int, Int) => Int, f: Int => Int, base: Int)(a: Int, b: Int): Int = { 
    (a: Int, b: Int) => 
     Int = { 
     def iter(a: Int, base: Int): Int = 
      if (a > b) base 
      else iter(a + 1, op(base, f(a))) 

     iter(a, base) 
     } 
    } 

不幸的是,我得到一個錯誤,說:重新分配給val。

所以我堅持如何修復arithmetic_iter_lambda。

回答

2

首先,要解決arithmetic_iter_lambda,嘗試:

def arithmetic_iter_lambda(op: (Int, Int) => Int, 
          f: Int => Int, 
          base: Int): (Int, Int) => Int = { 
    (a: Int, b: Int) => { 
     def iter(a: Int, base: Int): Int = 
      if (a > b) base 
      else iter(a + 1, op(base, f(a))) 

     iter(a, base) 
     } 
    } 

(請注意,我已經斬函數的自變量被分成幾行簡單地停止太長時間運行就行了)。

其次,鑑於你的初始arithmetic_iter功能,您可以通過獲得同樣的效果:

def alt_arithmetic_iter_lambda(
    op: (Int, Int) => Int, 
    f: Int => Int, 
    base: Int): (Int, Int) => Int = arithmetic_iter(op, f, base) _ 

(同樣,都可能是在同一行,但它會比較長)。

+0

其中,我甚至沒有意識到我在_iter函數上留下了(a,b)。感謝您的支持。二,所以我看到我沒有告訴我的外部函數,它會返回一個函數,[需要兩個Int並返回一個Int]。我現在明白我的錯誤。謝謝Shadowlands。 – dotnetN00b

+0

很高興我可以幫忙(並且rep的提升總是一個很好的謝謝你;)。實際上,在這種情況下,您可以關閉':(Int,Int)=> Int'結果類型說明,編譯器可以推斷出正確的結果類型,但我認爲它通常更有用(良好的自文檔代碼)讓它繼續 - 特別是如果你(或者其他讀取代碼的人)對Scala或這個習慣用法是新的。 – Shadowlands