2016-10-12 9 views
3

私は2つのリストを取り、それらを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リスト「をここ だが入力した」私はこのことを読みますパラメーターが不足している可能性がありますが、これについてはわかりません。

EDIT:

だから私はちょっとそれはこのように動作するようになった:

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;] それは何度も何度実行されますか?

EDIT 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は、リストの各要素に関数を適用します。その後、は結果を連結し、結合リストを返します。この2番目の動作は、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]] 

どのように我々は、出力 [10; 20; 30; 20; 40; 60; 30; 60; 90]を得るためにそれらを連結するList.collectを使用しないようにリストのリストを与えられているとしましょうか?

したがって、List.collectには、関数とリストが必要です。上に定義したリストのリストにはxを渡すことができますが、まだマップを行う関数が必要です。しかし、我々は実際にはidを使うべきであることを意味するxの要素の変換を実際には望んでいません。次に、

List.collect id x 

を使用します。あなたの特定の問題は、上記の問題と非常によく似ており、解決するのが難しいはずはありません。

+0

せて連結XS XS' = せcombList = XS @ XS' せconcatList = List.collect ID combList printfnの "%A" concatList 連結[1; 2; 3; 4] [5; 6; 7。 8] このような何かがうまくいくはずですか? – kthonenice

+0

ああ、それは読むことができません。質問に追加してみましょう – kthonenice

+0

idキーワードを使用すると、パラメータを取得してlet combListを追加しただけで動作します。 私は決して.collectをこの方法で使用しないでしょう。 ID推薦いただきありがとうございます。 – kthonenice

関連する問題