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.