gpt4 book ai didi

OCaml 函数类型 ('a -> ' b) -> 'a -> ' b

转载 作者:行者123 更新时间:2023-12-01 23:33:14 25 4
gpt4 key购买 nike

我在理解此类函数的工作原理时遇到了一些问题。

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 相同,只是参数顺序发生了变化,但我显然在这里遗漏了一些东西。有人可以请让我走上正确的道路?

最佳答案

真正的问题是你的 try_it 函数的参数数量是固定的。

你必须正确理解这一行发生了什么:

print_endline(string_of_int(try_it add_two 23 45));;

try_it add_two 23 返回一个类型为 int -> int 的函数,它依次计算值 45,得到 23 + 45。

但是如果你像以前那样改变 try_it 的定义,那么这一行就变成了:

print_endline(string_of_int(try_it 23 add_two 45));;

因此 try_it 23 add_two 返回一个 (int -> int) 函数,评估超过 45。

祝你有美好的一天!

关于OCaml 函数类型 ('a -> ' b) -> 'a -> ' b,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21510226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com