2016-11-07 83 views
0

您好!功能类型签名

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

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

((int - > int) - > int - > int - > int) - >(int - > int) - > int - > int - > int

我想要编写一个函数,它有上面这样的签名。有人会帮我解释一下吗?我会非常感谢:)

回答

4

函数的类型为'a -> 'b,取某些类型的值'a并返回某些类型的值'b。要使用特定类型,类型为int -> int的函数将接受一个int并返回一个int。例如,这是整数否定的类型。

一种方式来看待与'a -> 'b -> 'c类型的函数的方法是,它需要两个值,'a类型和'b,并返回'c类型的值。一个具体的例子是int -> int -> int的类型,这是整数加法(比如说)的类型:

# (+);; 
- : int -> int -> int = <fun> 

此模式继续用于多个参数。

您提供的类型在高级别具有此类型:'a -> 'b -> 'c -> 'd -> 'e。所以,这是一个有四个参数的函数。

第一个参数的类型为(int -> int) -> int -> int -> int,这本身就相当复杂。第二个参数的类型为int -> int,如上所述。第三个和第四个参数的类型为int。该函数返回一个int

对第一个参数使用相同的分析,可以看到它是一个带三个参数的函数。第一个是int -> int类型的函数,第二个和第三个类型是int。该函数返回一个int

这里的(int -> int) -> int -> int -> int类型的函数:

let myfun f a b = 
    (f a) + a + b 

你可以看到在OCaml的顶层类型:

# let myfun f a b = 
    (f a) + a + b;; 
val myfun : (int -> int) -> int -> int -> int = <fun> 
# 

你应该能够制定出休息。我不想通过给出完整的答案来解决问题。

+0

感谢您的回答!我不知道我是否理解正确,具有这个长签名的整个功能,它只会在“myfun”中?我必须申报新的变数或什么?对不起,这可能是愚蠢的问题,但我尝试了一些行动,只有val myfun:(int - > int) - > int - > int - > int - > int - > int – Bartek

+0

您需要声明一个像这样的函数:'让myfun2 ghab = ...'。在这个函数里面,你需要使用上面'myfun'接受的参数来调用'g',并且你需要使用上面'f'接受的参数来调用'h'。编译器通过查看在代码中如何使用它们来确定事物的类型。所以你必须以正确的方式使用它们来获得正确的类型。 –

+0

哦,我做到了!非常感谢!我现在无法赞成你,但我会做到这一点,当我可以:) – Bartek