函数式编程中函数的混淆问题

7

我正在学习函数式编程,使用的是Ocaml,但我的函数遇到了一些问题。

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

let bach (x,y):(float*float) = (x,y);;
val bach : float * float -> float * float = <fun>

All well and good up here.

let john (x,y):(float*float) = y;;
val john : 'a * (float * float) -> float * float = <fun>

现在让我感到困惑的是,为什么这里有一个'a?我知道它代表一个未知类型的变量,但我不明白如何通过更改返回值来添加它。

我自认为在函数式编程方面还是个新手,请不要咬我 :)

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

这个函数的类型是 'a * 'b -> 'b: 对于任何的 'a'b,你需要输入一个 ('a * 'b) 类型的数据对,并返回一个 'b 类型的值。


1
在你的两个示例中,你为定义函数的结果给出了类型约束,而不是其参数(可能是本意)。
因此,
let john (x, y) : (float * float) = y;;

这意味着john的结果(即y)应该是(float * float)类型。由于输入中有一个由x(其中没有任何已知信息)和y(类型为float * float)组成的对,因此输入的最终类型为'a * (float * flat)

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

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

-1
如果你想学习Ocaml和函数式编程的基础知识,Programming Languages 课程将再次在Coursera上提供。你将通过SML、Racket和Ruby学习编程语言概念,并有趣的作业来应用你所学的内容。强烈推荐。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接