接受F#函数的函数

时间:2016-08-21 17:21:37

标签: lambda 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 

应该怎么写?

2 个答案:

答案 0 :(得分:6)

你应该调用func传递这样的args

func x y

像使用C类语言一样使用parens会创建一个元组,这就是'a * 'b

当你声明/调用foo时,你也使用元组。

你可以这样做

let foo x y f =
    f x y

让类型推断算出来。将事物放在像(x, y)这样的括号中是在不需要的时候创建元组。

答案 1 :(得分:3)

如果你想做类型推断和curried参数,你可以这样做:

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

并使用它就像刚出现时一样。