我在理解这种类型的功能如何工作方面遇到了一些问题。
let try_it f x = f x;;
val try_it : ('a -> 'b) -> 'a -> 'b = <fun>
上面的函数try_it接受一个函数f,它接受一个多态参数并返回一个多态类型。现在我可以轻松地将函数+参数传递给不同数量的参数的try_it,如下所示,它可以工作。
let add_three a b c = a + b + c;;
let add_two a b = a + b;;
let try_it f x = f x;;
print_endline(string_of_int(try_it add_two 23 45));;
print_endline(string_of_int(try_it add_three 23 4 56));;
现在如果以上工作,为什么我不能创建一个名为try_it2的函数,它定义如下,并以相反的顺序传递相同的函数和参数?
let try_it2 x f = f x;;
val tryit2 : 'a -> ('a -> 'b) -> 'b = <fun>
对我来说try_it2与try_it相同,只是参数顺序改变但我显然在这里遗漏了一些东西。有人可以 请把我放在正确的道路上?
答案 0 :(得分:4)
真正的问题是你的try_it函数的参数数量是固定的。
你必须正确理解这一行所发生的事情:
print_endline(string_of_int(try_it add_two 23 45));;
try_it add_two 23返回int类型的函数 - &gt; int,反过来评估值45,给出23 + 45。
但是如果你改变了try_it的定义,那么这一行就变成了:
print_endline(string_of_int(try_it 23 add_two 45));;
这样try_it 23 add_two返回一个(int - &gt; int)函数,计算结果超过45。
度过美好的一天!