函数类型签名

Bar*_*tek 0 ocaml signature

我试图在互联网上的某个地方找到它,但是我没有做到这一点。我想学习OCaml,这对我来说很难理解。

我的问题是-当我有签名时,如何轻松编写函数。例如-我有这样的签名:

((int -> int) -> int -> int -> int) -> (int -> int) -> int -> int -> int
Run Code Online (Sandbox Code Playgroud)

我想写一个函数,上面有这样的签名。有人会帮助我还是尝试解释一下?我会很感激 :)

Jef*_*eld 5

具有类型的函数'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)

您应该能够解决其余的问题。我不想通过给出完整的答案来摆脱所有的乐趣。