2017-10-24 3 views
2

F#に関して問題があり、マップとセットを使用してキーでマップをフィルターします。 私はいくつかの方法を試しましたが、F#でどのように動作するかについて私の頭を包み込むことはできず、F#で必要なものをコード化する方法についていくつかアドバイスが必要です。F#マップキーをフィルターに設定して縮小マップを取得する

これは私がこれまで試みたコードであり、唯一の集合ヘッド=キー最初のインスタンスを返し:

let rec sumECTS cs cb = 
Map.filter(fun key desc -> key = (cs |> Seq.head)) cb 
;; 

CS = courseset:

let courseSet = set [ cn1 ; cn3 ; cn6 ];; 

とCN#があるのコース番号は5桁です。

Cbを= courseBase:CD#は2桁のECTSポイントです

let Coursebase1 = 
Map.empty. 
    Add(cn1,cd1). 
    Add(cn2,cd2). 
    Add(cn3,cd3). 
    Add(cn4,cd4). 
    Add(cn5,cd5). 
    Add(cn6,cd6);; 

+1

あなたが実際にしたいことは非常に不明です。 –

+1

私はあなたがそれをやろうとしていると思います - 'sum $ cs = Map.filter(fun key _ - > Set.contains key cs)' –

+0

@FoggyFinderあなたはそれを適切な答えにする必要があります。それは最も明白な答えであり、問​​題があれば理にかなっています。 – glennsl

答えて

0

おそらくこれらの行に沿った何か(66の例の結果)? https://dotnetfiddle.net/n2gdar

open System 

let sumEcts courseSet courseBase = 
    let isPartOfCourseSet cn _ = 
     courseSet |> Set.contains cn 

    courseBase 
    |> Map.filter isPartOfCourseSet 
    |> Map.toSeq 
    |> Seq.map (fun(cn, cd)->cd) 
    |> Seq.sum 

let courseBase = 
    [ 
     (11111, 11) 
     (22222, 22) 
     (33333, 33) 
     (44444, 44) 
     (55555, 55) 
    ] 
    |> Map.ofList 

let courseSet = 
    [11111; 22222; 33333 ] 
    |> Set.ofList 

courseBase 
|> sumEcts courseSet 
|> Console.WriteLine 
関連する問題