[1]:
# let make pair int (x:int) (y:int) = x,y ;;
val make_pair_int : int -> int -> int * int = <fun>
您如何阅读输入信息输出?在其他语言中,我发现能够用语法或打印输出来构造一个有说服力的英语句子,这对于理解正在发生的事情至关重要。上述OCaml声明的句子是什么?
有人可以绘制出打印输出以便将打字信息关联回英文吗?像:
val make_pair_int : int -> int -> int * int = <fun>
| | | | | \_____/ \__/
| | | | | | ` is a function
| | | | | ` a tuple of integers
| | | | `
| | | `
| | `
| `
` symbol make_pair_int is bound to
答案 0 :(得分:3)
这只是您的函数的curried版本。阅读这样一个函数取决于curried notation对函数的适应程度。
要点是采用两个参数是一个完全不同的概念,与采用一对参数在对的意义上完全不同引用特定类型构造函数(隐藏在ocaml代码段中的*
和,
符号下的内容)。
如果您不想引用配对(或 tupling ,如果您想要任意数组的参数)构建,您会怎么做?对该问题的讨论答案是使用高阶函数的答案:
val make_pair_int : int -> int -> int * int = <fun>
| | | | | \_____/ \__/
| | | | | | ` and all that is a higher-order function
| | | | | ` a pair of integers
| | | | `and returns
| | | `a function that takes an integer as an argument
| | `and returns
| ` something that takes an integer as an argument
` symbol make_pair_int is bound to
通过隐含的约定,这种曲解的解释(及其附带的符号)是一种可以考虑采用多个参数的函数的方法,你可以只计算类型中箭头的数量,并考虑之前的那些最后一个作为你的函数的“参数”。
答案 1 :(得分:2)
我想这是非常主观的,取决于功能的使用。通常我会尝试将此作为函数的未发布版本阅读,然后在我的脑海中阅读。但是,如果我实际上使用此函数来构造闭包,我可能会将其视为不同的东西。
所以在这种情况下,根据上下文我使用这个函数我会把它读作:
“从int和int到整数元组的函数”
在其他情况下,可能会变成:
“函数从int到函数从int到整数元组”
我想在同一功能的两个表示之间切换的能力为以后使用该功能提供了很大的灵活性。