7

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

4

3 回答 3

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可以是任何类型,因此该函数的类型是多态的,它表示为类型变量'a。整个函数的类型'a * (float * float) -> float * float,表示对于任何类型'a,你可以传递一个元组'a和一个元组(float * float),它会返回一个(float * float)

这是函数的一个特例snd

let snd (x, y) = y

它有 type 'a * 'b -> 'b:对于任何'aand 'b,你取一对('a * 'b)并返回 type 的值'b

于 2013-08-02T06:57:06.627 回答
1

在您的两个示例中,您都为已定义函数的结果提供类型约束,而不是其参数(可能是预期的)。

因此

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

意味着john(ie, y) 的结果应该是 类型(float * float)。现在,由于在输入中我们有一对由x(其中一无所知)和y(类型float * float)组成,因此输入的最终类型是'a * (float * flat)

要得到你想要的,你可以使用:

let john ((x:float), (y:float)) = y;;
于 2013-08-02T06:57:22.003 回答
-1

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

于 2013-08-02T19:05:57.620 回答