2016-10-12 28 views
3

我想定義一個函數,它需要兩個列表並將它們組合使用List.collect。使用List.collect f#

let concat xs xs' = 
    let concatList = List.collect xs xs' 
    printfn "%A" concatList 

concat [1;2;3;4] [5;6;7;8] 

我得到的錯誤信息: FS0001:此表達預計將有型'A->「B名單」 但這裏的類型是「」 C名單」

,我讀了這可能是由於缺少參數,但我不確定這一點。

編輯:

所以我有點懂了這樣的工作:

let concat xs xs' = 
    let concatList = List.collect (fun x -> xs @ xs') xs 
    printfn "%A" concatList 

concat [1;2;3;4] [5;6;7;8] 

但輸出爲:[1; 2; 3; 4; 5; 6; 7; 8; 1; 2; 3 4; 5; 6; 7; 8; 1; 2; 3 4; 5; 6; 7; 8; 1; 2; 3 4; 5; 6; 7; 8;]

只希望它是[1; 2; 3 4; 5; 6; 7; 8;] 任何想法,爲什麼它運行很多次?

編輯2:

所以我得到了它這樣的工作:

let concat xs xs' = 
    let combList = [[xs];[xs']] 
    let concatList = List.collect id combList 
    printfn "%A" concatList 

concat [1;2;3;4] [5;6;7;8] 
+4

這不是'List.collect'的作用。你的意思是'List.concat'? –

+1

我以爲List.concat會更有意義。但我被告知不要使用它。 閱讀關於List.collect並且它聲明: 「對於列表中的每個元素,應用給定函數,連接所有結果並返回組合列表。」 – kthonenice

+0

那麼問題是什麼呢? –

回答

5

當您在評論中指出,List.collect應用一個函數到列表中的每個元素。之後,連接結果並返回組合列表。第二種行爲是讓您產生類似於List.concat的行爲。

我們需要做些什麼來實現這一目標?

讓我們嘗試尋找的文件例如:

let list1 = [10; 20; 30] 
let collectList = List.collect (fun x -> [for i in 1..3 -> x * i]) list1 
printfn "%A" collectList 
//Output 
//[10; 20; 30; 20; 40; 60; 30; 60; 90] 

發生了什麼事在這個例子是,對於list1每一個元素,我們正在申請的功能(fun x -> [for i in 1..3 -> x * i])。這給了我們與使用List.map相同的結果。結果是[[10; 20; 30]; [20; 40; 60]; [30; 60; 90]],然後將其與List.collect連接成上面的最終結果。

現在就你的問題,讓我們考慮一個相關的問題。比方說,我們給出的一覽表,如

let x = [[10; 20; 30]; [20; 40; 60]; [30; 60; 90]] 

我們如何使用List.collect將它們串聯,以獲得輸出 [10; 20; 30; 20; 40; 60; 30; 60; 90]的名單?

因此,List.collect需要一個函數和一個列表。我們可以通過上面定義的列表,x,但我們仍然需要一個可以繪製地圖的函數。但是,我們並不想對x的元素進行任何轉換,我們只是想按原樣使用它們,這意味着我們應該使用id。然後使用

List.collect id x 

將返回所需的結果。您的具體問題與上述問題非常相似,不應太難解決。

+0

讓的concat XS XS最小= 讓combList = XS @ XS' 讓concatList = List.collect ID combList printfn 「%A」 concatList 的concat [1; 2; 3; 4] [5; 6; 7; 8] 所以這樣的事情應該工作? – kthonenice

+0

哦,你不能讀那個。讓我將其添加到問題 – kthonenice

+0

使用id關鍵字使它工作,如果我只是參數並添加了讓combList。 我永遠不會使用.collect這樣,所以看起來很奇怪,我被告知。 感謝您的ID建議。 – kthonenice