功能编程功能混乱

Sec*_*ret 7 ocaml functional-programming

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

无论如何,我有一个元组,我想返回它的第一个值.(很简单,我知道,对不起)

let bach (x,y):(float*float) = (x,y);;
val bach : float * float -> float * float = <fun>
Run Code Online (Sandbox Code Playgroud)

一切都很好,在这里很好.

let john (x,y):(float*float) = y;;
val john : 'a * (float * float) -> float * float = <fun>
Run Code Online (Sandbox Code Playgroud)

现在这让我很困惑.为什么'a那里?我知道它代表一个类型未知的变量,但我很困惑如何更改返回值.

我是一个自称n00b的函数式编程,请不要吃我:)

gas*_*che 10

您被一个微妙的语法错误所困扰,这对于初学者来说真的不明显:

 let foo x : t = bar
Run Code Online (Sandbox Code Playgroud)

是不一样的

 let foo (x : t) = bar
Run Code Online (Sandbox Code Playgroud)

相反,它相当于

 let foo x = (bar : t)
Run Code Online (Sandbox Code Playgroud)

约束函数的返回类型.

.

所以你写了

let john (x, y) = (y : float * float)
Run Code Online (Sandbox Code Playgroud)

输入类型是一对,其第二个元素y具有类型float * float.但是x可以是任何类型,因此该函数在其类型中是多态的,它表示为类型变量'a.整个函数的类型'a * (float * float) -> float * float,表示对于任何类型'a,您可以传递一个'a和一个元组,(float * float)它将返回一个(float * float).

这是该snd功能的一个特例:

let snd (x, y) = y
Run Code Online (Sandbox Code Playgroud)

它有类型'a * 'b -> 'b:对于任何'a'b,你需要一对('a * 'b)并返回一个类型的值'b.