2016-08-21 82 views
1

我想做一個接受兩個值和一個函數的函數。我無法理解語法,所以我做了一個小例子:F#中接受函數的函數

let foo (x : int, y : int, func : int -> int -> int) = 
    func(x, y) 

預期輸出:

> foo(2, 3, fun x y -> x + y) 
5 

但是我得到的編譯錯誤:

The expression was expected to have type int, but here has type 'a * 'b 

應該如何這是寫?

回答

6

你應該叫func傳遞ARGS這樣

func x y 

使用括號就像你在一個C型語言將創建一個元組,這是什麼'a * 'b是。

另外,當你聲明/調用foo時,你也使用元組。

你可能只需要做到這一點

let foo x y f = 
    f x y 

並讓類型推斷看着辦吧。當你不需要的時候,把東西放在括號裏,如(x, y)就是創建元組。

3

如果你想要做的類型推斷和咖喱參數,你可以這樣做:

let foo (x : int) (y : int) (func : int -> int -> int) = 
    func x y 

使用它像foo 2 3 (fun x y -> x + y)

如果你想使用一個元組,你可以這樣做:

let foo (x, y, func) = 
    func x y 

然後你可以在你的例子中使用它:foo(2, 3, fun x y -> x + y)

如果你想要做的類型推斷和一個元組,你可以這樣做:

let foo ((x, y, func) : (int * int * (int -> int -> int))) = 
     func x y 

,並使用時,這只是tupled什麼樣子。