功能签名

时间:2017-10-06 10:06:14

标签: f#

我想创建一个函数map3,给定一个函数f,一个元组(a, b, c)f应用于元组的每个成员。该函数的预期签名应为:

('a -> 'b) -> 'a * 'a * 'a -> 'b * 'b * 'b

我尝试了几种方法:

> let map3 = fun x -> let f = fun (a, b, c) -> (a, b, c) in f x;;
val map3 : 'a * 'b * 'c -> 'a * 'b * 'c

> let map3 = fun x y -> x (let f = fun (a, b, c) -> (a, b, c) in f y);;
val map3 : x:('a * 'b * 'c -> 'd) -> 'a * 'b * 'c -> 'd

> let map3 = fun (x, y, z) -> let f = fun (a, b, c) -> (a, b, c) in f (x, y, z);; 
val map3 : x:'a * y:'b * z:'c -> 'a * 'b * 'c

我强烈怀疑我没有得到功能签名实际工作的方式。根据{{​​3}},map3应该有一个输入和一个输出,而f应该将三元组作为输入并返回三元组。但事情显然是错误的。在我尝试实施它的过程中,我错过了什么?

1 个答案:

答案 0 :(得分:6)

let map3 f (x, y, z) = (f x, f y, f z)

你也可以像

一样写
let map3 f = fun (x, y, z) -> (f x, f y, f z)

let map3 = fun f (x, y, z) -> (f x, f y, f z)

但我更喜欢左侧的参数。正如您所看到的,第一个版本的编写时间更短,更易于阅读。