Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 函数编程函数混淆_Functional Programming_Ocaml - Fatal编程技术网

Functional programming 函数编程函数混淆

Functional programming 函数编程函数混淆,functional-programming,ocaml,Functional Programming,Ocaml,我正在学习函数式编程并使用Ocaml,但我在函数方面有点问题 无论如何,我有一个元组,我想返回它的第一个值。(很简单,我知道,对不起) 让bach(x,y):(float*float)=(x,y);; 瓦尔巴赫:浮动*浮动->浮动*浮动= 这里一切都很好 let john (x,y):(float*float) = y;; val john : 'a * (float * float) -> float * float = <fun> 让john(x,y):(float*f

我正在学习函数式编程并使用Ocaml,但我在函数方面有点问题

无论如何,我有一个元组,我想返回它的第一个值。(很简单,我知道,对不起)

让bach(x,y):(float*float)=(x,y);;
瓦尔巴赫:浮动*浮动->浮动*浮动=
这里一切都很好

let john (x,y):(float*float) = y;;
val john : 'a * (float * float) -> float * float = <fun>
让john(x,y):(float*float)=y;;
瓦尔·约翰:“a*(浮点*浮点)->浮点*浮点=
这就是让我困惑的地方。为什么那里有一个
'a
?我知道它代表一个未知类型的变量,但我不知道如何更改返回值来增加它


我自称是函数式编程的n00b,请不要吃我:)

你被一个对初学者来说并不明显的微妙语法错误咬到了:

 let foo x : t = bar
不一样

 let foo (x : t) = bar
相反,它相当于

 let foo x = (bar : t)
约束函数的返回类型

那么你已经写信了

let john (x, y) = (y : float * float)
输入类型是一对,其第二个元素
y
的类型为
float*float
。但是
x
可以是任何类型,因此函数的类型是多态的,它表示为类型变量
'a
。整个函数的类型,
'a*(float*float)->float*float
,表示对于任何类型的
'a
,您可以传递
'a
(float*float)
的元组,它将返回
(float*float)

这是
snd
功能的一种特殊情况:

let snd (x, y) = y

类型为
'a*'b->'b
:对于任何
'a
'b
,您需要一对
('a*'b)
,并返回类型为
'b

的值。在这两个示例中,您为定义函数的结果提供类型约束,而不是它的参数(可能是有意的)

因此

表示
john
(即
y
)的结果应为
(float*float)
类型。现在,由于在输入中我们有一对由
x
(未知)和
y
(类型
float*float
)组成,因此输入的最终类型是
'a*(float*flat)

要获得您想要的,您可以使用:

let john ((x:float), (y:float)) = y;;

如果您想学习Ocaml和函数式编程,Coursera将再次提供该课程。您将通过SML、Racket和Ruby学习编程语言概念,并通过有趣的作业应用所学内容。强烈推荐

let john (x, y) : (float * float) = y;;
let john ((x:float), (y:float)) = y;;