2016-08-21 101 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什么样子。