您好!功能类型签名
我试图在互联网上找到这个地方,但我没有做到这一点。我想学习OCaml,这对我来说很难理解,如何做到这一点。
我的问题是 - 我如何轻松写一个函数,当我有签名。例如 - 我有这样的签名:
((int - > int) - > int - > int - > int) - >(int - > int) - > int - > int - > int
我想要编写一个函数,它有上面这样的签名。有人会帮我解释一下吗?我会非常感谢:)您好!功能类型签名
我试图在互联网上找到这个地方,但我没有做到这一点。我想学习OCaml,这对我来说很难理解,如何做到这一点。
我的问题是 - 我如何轻松写一个函数,当我有签名。例如 - 我有这样的签名:
((int - > int) - > int - > int - > int) - >(int - > int) - > int - > int - > int
我想要编写一个函数,它有上面这样的签名。有人会帮我解释一下吗?我会非常感谢:)函数的类型为'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>
#
你应该能够制定出休息。我不想通过给出完整的答案来解决问题。
感谢您的回答!我不知道我是否理解正确,具有这个长签名的整个功能,它只会在“myfun”中?我必须申报新的变数或什么?对不起,这可能是愚蠢的问题,但我尝试了一些行动,只有val myfun:(int - > int) - > int - > int - > int - > int - > int – Bartek
您需要声明一个像这样的函数:'让myfun2 ghab = ...'。在这个函数里面,你需要使用上面'myfun'接受的参数来调用'g',并且你需要使用上面'f'接受的参数来调用'h'。编译器通过查看在代码中如何使用它们来确定事物的类型。所以你必须以正确的方式使用它们来获得正确的类型。 –
哦,我做到了!非常感谢!我现在无法赞成你,但我会做到这一点,当我可以:) – Bartek