2017-10-24 17 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 번호는입니다 course 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