我正在学习函数式编程,并且正在使用Ocaml,但我的函数有点问题。
无论如何,我有一个元组,我想返回它的第一个值。 (很简单,我知道,抱歉)
let bach (x,y):(float*float) = (x,y);;
val bach : float * float -> float * float = <fun>
一切都很好,在这里很好。
let john (x,y):(float*float) = y;;
val john : 'a * (float * float) -> float * float = <fun>
现在这让我很困惑。为什么有'a
?我知道它代表一个具有未知类型的变量,但是我很困惑如何更改返回值。
我是一个自称为n00b的函数式编程,请不要吃我:)
答案 0 :(得分:10)
你被一个微妙的语法错误所困扰,这对于初学者来说真的不明显:
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
可以是任何类型,因此函数的类型为 polymorphic ,它表示为类型变量'a
。整个函数的类型'a * (float * float) -> float * float
表示对于任何类型'a
,您可以传递'a
和(float * float)
的元组,它将返回{ {1}}。
这是(float * float)
函数的一个特例:
snd
类型let snd (x, y) = y
:对于任何'a * 'b -> 'b
和'a
,您需要一对'b
并返回('a * 'b)
类型的值。
答案 1 :(得分:1)
在两个示例中,您为定义的函数的结果赋予类型约束,而不是其参数(可能是预期的)。
因此
let john (x, y) : (float * float) = y;;
表示john
(即y
)的结果应为(float * float)
类型。现在,因为在输入中我们有一对由x
(其中一无所知)和y
(类型为float * float
)组成的对,输入的最终类型为{{1 }}
为了得到你想要的东西,你可以使用:
'a * (float * flat)
答案 2 :(得分:-1)
如果你想学习Ocaml和函数式编程,那么Programming Languages课程将再次在Coursera中提供。您将学习SML,Racket和Ruby的编程语言概念,并通过有趣的作业来应用您学到的知识。强烈推荐。