我想创建一个接受两个值和一个函数的函数。我无法理解语法,所以我做了一个最小的例子:
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
应该怎么写?
答案 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
并使用它就像刚出现时一样。