Functional programming 函数编程函数混淆
我正在学习函数式编程并使用Ocaml,但我在函数方面有点问题 无论如何,我有一个元组,我想返回它的第一个值。(很简单,我知道,对不起)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
让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;;