我试图在互联网上的某个地方找到它,但是我没有做到这一点。我想学习OCaml,这对我来说很难理解。
我的问题是-当我有签名时,如何轻松编写函数。例如-我有这样的签名:
((int -> int) -> int -> int -> int) -> (int -> int) -> int -> int -> int
Run Code Online (Sandbox Code Playgroud)
我想写一个函数,上面有这样的签名。有人会帮助我还是尝试解释一下?我会很感激 :)
具有类型的函数'a -> 'b,接受某种类型的'a值并返回某种类型的值'b。要使用特定类型,类型的函数int -> int需要一个int并返回一个int。例如,这是整数取反的类型。
查看具有type的函数的一种方法'a -> 'b -> 'c是,它接受type 'a和的两个值'b,并返回type的值'c。一个具体的例子是type int -> int -> int,它是整数加法的类型(例如):
# (+);;
- : int -> int -> int = <fun>
Run Code Online (Sandbox Code Playgroud)
这种模式继续存在更多的论点。
您提供的类型在较高级别具有此类型:'a -> 'b -> 'c -> 'd -> 'e。因此,这是一个具有四个参数的函数。
第一个参数的类型(int -> int) -> int -> int -> int很复杂。第二个参数具有type int -> int,如上所述。第三个和第四个参数的类型为int。该函数返回一个int。
对第一个参数使用相同的分析,您可以看到它是一个具有三个参数的函数。第一个是类型的函数,int -> int第二个和第三个是类型int。此函数返回一个int。
这是一个type函数(int -> int) -> int -> int -> int:
let myfun f a b =
(f a) + a + b
Run Code Online (Sandbox Code Playgroud)
您可以在OCaml顶层看到类型:
# let myfun f a b =
(f a) + a + b;;
val myfun : (int -> int) -> int -> int -> int = <fun>
#
Run Code Online (Sandbox Code Playgroud)
您应该能够解决其余的问题。我不想通过给出完整的答案来摆脱所有的乐趣。