2017-10-06 83 views
3

我想创建一个函数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 

我强烈怀疑,我没有得到函数签名是如何工作的。根据what I getmap3应该有一个输入和一个输出,而f应该输入一个三元组并返回一个三元组。但是这显然是错误的。我在尝试实施它时遇到了什么?

+1

这是一个提示 - 从'let map3 f ='开始。此外,人们不倾向于使用'in'语法 –

+1

我正在努力!我没有想到这种方法。你也正确的使用'in'。我们课程中提出的这本书很过时。我正在学习这两种风格,只是为了让学习更容易。 – Worice

+0

有许多F#书籍,你可以看看例如http://fsharpforfunandprofit.com/posts/fsharp-in-60-seconds/。 – s952163

回答

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) 

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

+0

您不需要等号右边的括号。当然,使用它们没有任何问题。另一方面,参数元组必须在所有三种情况下都在括号内。只是我的0.02美元。 – Soldalma

+1

当然可以。我让他们向读者说明这是一个元组,但在某些情况下它们是可选的。 – Gustavo

+0

感谢您的直接答案。它实际上帮助我甚至超出了我的要求! – Worice