2014-12-19 48 views
1

這裏是我的功能:如何執行接受並返回另一個的用戶定義函數?

def partial1[A, B, C](a: A, f: (A, B) => C): B => C = (b: B) => f(a, b)      
> partial1: [A, B, C](a: A, f: (A, B) => C)B => C 

在這裏,我調用該函數partial1

def fun(a: Int, b: Int) = a + b 
> fun: (a: Int, b: Int)Int 

val r = partial1(1, fun)      
> r : Int => Int = <function1> 

r(fun(1,3))          
> res0: Int = 5 

所以r是一個函數,它接受一個函數作爲參數和返回(1個參數的函數)一Function1Int => Int應該不是Int, Int,因爲兩個Int是函數參數嗎?

爲什麼我不能執行Partial1partial1(1,(fun(1,3)))這會導致編譯器錯誤:type mismatch; found : Int required: (?, ?) => ?

+0

在哪個位置出現類型不匹配? –

+0

(Scala編譯器通常會打印有問題的代碼行並指向此行中的特定位置。) –

+0

@Sarge Borsch錯誤在行「partial1(1,fun(2,3))」 –

回答

6

首先,partial1不是部分功能。這是一個返回另一個函數的函數,因此它是一個高階函數。

你得到的編譯錯誤是因爲partial1需要一個功能(A, B) => C,但你傳遞fun(1,3),其計算結果爲Int。而Int(Int, Int) => Int不一樣。

0
class ex03 { 
    def partial1[A,B,C](a:A, f:(A,B) => C): B => C = f(a,_) 
} 

class ex03Test extends UnitSpec { 

    behavior of "partial1" 
    it should "return 6" in { 
    val e = new ex03 
    val multiplyByTwo = e.partial1(2, (a:Int, b:Int) => a * b) 
    multiplyByTwo(3) mustBe 6 
    }} 
+0

歡迎來到Stack Overflow。僅有代碼的答案不會與具有解釋性文字的代碼一樣有用。如果問題已經很老了,並且已經有了一個可以接受的答案,那麼它有助於理解你的答案爲問題增添了什麼。在這種情況下,你似乎錯過了問題的要點。 OP知道如何以類似於您的示例的方式調用'partial1',但詢問不同形式的調用不起作用。 – jwvh

相關問題