功能编程功能混乱

时间:2013-08-02 06:18:34

标签: functional-programming ocaml

我正在学习函数式编程,并且正在使用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的函数式编程,请不要吃我:)

3 个答案:

答案 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的编程语言概念,并通过有趣的作业来应用您学到的知识。强烈推荐。