2017-10-06 77 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