How to use match Map elements in F#?





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















I tried to create a function that takes two integers a,b as input and return 5 if a=1 b=2 and 6 otherwise, Here is what I did:



let examplef (a:int), (b:int)=
match a,b with
|1,2 -> 5
|_,_->6;;


It gives this error: "The pattern discriminator 'examplef' is not defined."



I ask this question because of the error in this code:



type Team = string 
type Goals = Goals of int
type Points = Points of int
type Fixture = Team * Team
type Result = (Team * Goals) * (Team * Goals)
type Table = Map<Team,Points>

let league =["Chelsea"; "Spurs"; "Liverpool"; "ManCity"; "ManUnited"; "Arsenal"; "Everton"; "Leicester"]

let pointsMade (a: Result)=
match a with
|((b,Goals bg),(c,Goals cg))-> if b<c then ((b,Points 0),(c, Points 3))
elif b=c then ((b,Points 1),(c,Points 1))
else ((b, Points 3),(c, Points 0))


I get an error when trying to define the following function:



let updateTable (t:Table, r: Result)= 
let pointmade = pointsMade r
match pointmade with
|((f,Points s),(f1,Points s1))-> match Map.tryFind f t Map.tryFind f1 t with
|None, None -> t
|Some Points x, Some Points y ->t .Add (f, Points s+x1) .Add(f1, Points s1+y1)


When I hover the mouse over the first "Map.tryFind f t" It says "This value is not a function and cannot be applied. Also, there is an error with t .Add (f, Points s+x1) .Add(f1, Points s1+y1) it says: "Successive arguments should be separated by space and tuples and arguments involving functions or method applications should be parenthesized".
Please help










share|improve this question




















  • 3





    You are missing a comma between Map.tryFind f t and Map.tryFind f1 t

    – AMieres
    Jan 3 at 22:31













  • Thank you!! Also, what about the error I get for "t .Add (f, Points s+x1) .Add(f1, Points s1+y1)"?

    – nafhgood
    Jan 4 at 6:56






  • 1





    Easy, you need to use parenthesis: Points(s+x1)

    – AMieres
    Jan 4 at 8:09


















0















I tried to create a function that takes two integers a,b as input and return 5 if a=1 b=2 and 6 otherwise, Here is what I did:



let examplef (a:int), (b:int)=
match a,b with
|1,2 -> 5
|_,_->6;;


It gives this error: "The pattern discriminator 'examplef' is not defined."



I ask this question because of the error in this code:



type Team = string 
type Goals = Goals of int
type Points = Points of int
type Fixture = Team * Team
type Result = (Team * Goals) * (Team * Goals)
type Table = Map<Team,Points>

let league =["Chelsea"; "Spurs"; "Liverpool"; "ManCity"; "ManUnited"; "Arsenal"; "Everton"; "Leicester"]

let pointsMade (a: Result)=
match a with
|((b,Goals bg),(c,Goals cg))-> if b<c then ((b,Points 0),(c, Points 3))
elif b=c then ((b,Points 1),(c,Points 1))
else ((b, Points 3),(c, Points 0))


I get an error when trying to define the following function:



let updateTable (t:Table, r: Result)= 
let pointmade = pointsMade r
match pointmade with
|((f,Points s),(f1,Points s1))-> match Map.tryFind f t Map.tryFind f1 t with
|None, None -> t
|Some Points x, Some Points y ->t .Add (f, Points s+x1) .Add(f1, Points s1+y1)


When I hover the mouse over the first "Map.tryFind f t" It says "This value is not a function and cannot be applied. Also, there is an error with t .Add (f, Points s+x1) .Add(f1, Points s1+y1) it says: "Successive arguments should be separated by space and tuples and arguments involving functions or method applications should be parenthesized".
Please help










share|improve this question




















  • 3





    You are missing a comma between Map.tryFind f t and Map.tryFind f1 t

    – AMieres
    Jan 3 at 22:31













  • Thank you!! Also, what about the error I get for "t .Add (f, Points s+x1) .Add(f1, Points s1+y1)"?

    – nafhgood
    Jan 4 at 6:56






  • 1





    Easy, you need to use parenthesis: Points(s+x1)

    – AMieres
    Jan 4 at 8:09














0












0








0








I tried to create a function that takes two integers a,b as input and return 5 if a=1 b=2 and 6 otherwise, Here is what I did:



let examplef (a:int), (b:int)=
match a,b with
|1,2 -> 5
|_,_->6;;


It gives this error: "The pattern discriminator 'examplef' is not defined."



I ask this question because of the error in this code:



type Team = string 
type Goals = Goals of int
type Points = Points of int
type Fixture = Team * Team
type Result = (Team * Goals) * (Team * Goals)
type Table = Map<Team,Points>

let league =["Chelsea"; "Spurs"; "Liverpool"; "ManCity"; "ManUnited"; "Arsenal"; "Everton"; "Leicester"]

let pointsMade (a: Result)=
match a with
|((b,Goals bg),(c,Goals cg))-> if b<c then ((b,Points 0),(c, Points 3))
elif b=c then ((b,Points 1),(c,Points 1))
else ((b, Points 3),(c, Points 0))


I get an error when trying to define the following function:



let updateTable (t:Table, r: Result)= 
let pointmade = pointsMade r
match pointmade with
|((f,Points s),(f1,Points s1))-> match Map.tryFind f t Map.tryFind f1 t with
|None, None -> t
|Some Points x, Some Points y ->t .Add (f, Points s+x1) .Add(f1, Points s1+y1)


When I hover the mouse over the first "Map.tryFind f t" It says "This value is not a function and cannot be applied. Also, there is an error with t .Add (f, Points s+x1) .Add(f1, Points s1+y1) it says: "Successive arguments should be separated by space and tuples and arguments involving functions or method applications should be parenthesized".
Please help










share|improve this question
















I tried to create a function that takes two integers a,b as input and return 5 if a=1 b=2 and 6 otherwise, Here is what I did:



let examplef (a:int), (b:int)=
match a,b with
|1,2 -> 5
|_,_->6;;


It gives this error: "The pattern discriminator 'examplef' is not defined."



I ask this question because of the error in this code:



type Team = string 
type Goals = Goals of int
type Points = Points of int
type Fixture = Team * Team
type Result = (Team * Goals) * (Team * Goals)
type Table = Map<Team,Points>

let league =["Chelsea"; "Spurs"; "Liverpool"; "ManCity"; "ManUnited"; "Arsenal"; "Everton"; "Leicester"]

let pointsMade (a: Result)=
match a with
|((b,Goals bg),(c,Goals cg))-> if b<c then ((b,Points 0),(c, Points 3))
elif b=c then ((b,Points 1),(c,Points 1))
else ((b, Points 3),(c, Points 0))


I get an error when trying to define the following function:



let updateTable (t:Table, r: Result)= 
let pointmade = pointsMade r
match pointmade with
|((f,Points s),(f1,Points s1))-> match Map.tryFind f t Map.tryFind f1 t with
|None, None -> t
|Some Points x, Some Points y ->t .Add (f, Points s+x1) .Add(f1, Points s1+y1)


When I hover the mouse over the first "Map.tryFind f t" It says "This value is not a function and cannot be applied. Also, there is an error with t .Add (f, Points s+x1) .Add(f1, Points s1+y1) it says: "Successive arguments should be separated by space and tuples and arguments involving functions or method applications should be parenthesized".
Please help







f#






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 4 at 6:33







nafhgood

















asked Jan 3 at 22:13









nafhgoodnafhgood

1619




1619








  • 3





    You are missing a comma between Map.tryFind f t and Map.tryFind f1 t

    – AMieres
    Jan 3 at 22:31













  • Thank you!! Also, what about the error I get for "t .Add (f, Points s+x1) .Add(f1, Points s1+y1)"?

    – nafhgood
    Jan 4 at 6:56






  • 1





    Easy, you need to use parenthesis: Points(s+x1)

    – AMieres
    Jan 4 at 8:09














  • 3





    You are missing a comma between Map.tryFind f t and Map.tryFind f1 t

    – AMieres
    Jan 3 at 22:31













  • Thank you!! Also, what about the error I get for "t .Add (f, Points s+x1) .Add(f1, Points s1+y1)"?

    – nafhgood
    Jan 4 at 6:56






  • 1





    Easy, you need to use parenthesis: Points(s+x1)

    – AMieres
    Jan 4 at 8:09








3




3





You are missing a comma between Map.tryFind f t and Map.tryFind f1 t

– AMieres
Jan 3 at 22:31







You are missing a comma between Map.tryFind f t and Map.tryFind f1 t

– AMieres
Jan 3 at 22:31















Thank you!! Also, what about the error I get for "t .Add (f, Points s+x1) .Add(f1, Points s1+y1)"?

– nafhgood
Jan 4 at 6:56





Thank you!! Also, what about the error I get for "t .Add (f, Points s+x1) .Add(f1, Points s1+y1)"?

– nafhgood
Jan 4 at 6:56




1




1





Easy, you need to use parenthesis: Points(s+x1)

– AMieres
Jan 4 at 8:09





Easy, you need to use parenthesis: Points(s+x1)

– AMieres
Jan 4 at 8:09












3 Answers
3






active

oldest

votes


















1














It looks like you're confusing tuple and curried arguments.



Examples with a single tuple argument (parenthesis are requiered).



signature: int * int -> int



//let example1 (a: int, b:int) = 
let example1 (a, b) =
match a, b with
| 1, 2 -> 5
| _ -> 6

//let example2 (t: int * int) =
let example2 t =
match t with
| 1, 2 -> 5
| _ -> 6


Example with two curried arguments:



signature: int-> int -> int



//let example3 (a: int) (b: int) = 
let example3 a b =
match a, b with
| 1, 2 -> 5
| _ -> 6





share|improve this answer

































    1














    In your "working code", in the pointsMade function you do not need to use pattern matching, you can simply use a let binding.



    let pointsMade (r: Result) =
    let (t1, Goals g1), (t2, Goals g2) = r
    if g1 < g2 then (t1, Points 0), (t2, Points 3)
    elif g1 = g2 then (t1, Points 1), (t2, Points 1)
    else (t1, Points 3), (t2, Points 0)


    The updateTable function also can be re-written in more concise way by using some addPoints function to avoid repeating the same thing for each team.



    let addPoints (team: Team, Points points) (table: Table) =
    match Map.tryFind team table with
    | None -> table
    | Some (Points p) -> Map.add team (Points (points + p)) table

    let updateTable (table: Table, result: Result) =
    let pts1, pts2 = pointsMade result
    table |> addPoints pts1 |> addPoints pts2





    share|improve this answer































      0














      Anyway, The code that work looks like this:



      open System.Security.Cryptography
      open System.Threading

      type Team = string
      type Goals = Goals of int
      type Points = Points of int
      type Fixture = Team * Team
      type Result = (Team * Goals) * (Team * Goals)
      type Table = Map<Team,Points>

      let league =["Chelsea"; "Spurs"; "Liverpool"; "ManCity"; "ManUnited"; "Arsenal"; "Everton"; "Leicester"]

      let pointsMade (a: Result)=
      match a with
      |((b,Goals bg),(c,Goals cg))-> if bg<cg then ((b,Points 0),(c, Points 3))
      elif bg=cg then ((b,Points 1),(c,Points 1))
      else ((b, Points 3),(c, Points 0))

      let initEntry (name:Team)=(name, Points 0)

      let initializeTable l = Map.ofList (List.map initEntry l)

      let updateTable (t:Table, r: Result)=
      let pointmade = pointsMade r
      match pointmade with
      |((f,Points s),(f1,Points s1))-> match Map.tryFind f t, Map.tryFind f1 t with
      |None, None -> t
      |Some x, Some y-> match x,y with
      | Points x1 , Points y1 -> t |> Map.add f (Points(x1+s)) |> Map.add f1 (Points (y1+s1))
      |None, Some y -> match y with
      | Points y1 -> t.Add(f,Points s) .Add(f1, Points (s1+y1))
      |Some x, None -> match x with
      | Points x1 -> t.Add(f,Points (s+x1)) .Add(f1, Points s1)


      let rec weekendUpdate (t:Table , rl:Result list)=
      match rl with
      |->t
      |ai::at-> weekendUpdate(updateTable(t,ai),at)

      let rec seasonUpdate (t:Table, sll: Result list list)=
      match sll with
      |->t
      |ah::at-> seasonUpdate(weekendUpdate(t,ah),at)

      let less((s1,n1):Team * Points, (s2,n2):Team * Points) =
      match n1,n2 with
      |Points m1,Points m2 ->if m1<m2 then true
      else false

      let rec myinsert item lst =
      match lst with
      | -> [item]
      | x::xs -> if less(item,x) then x::(myinsert item xs) else item::lst

      let rec isort lst =
      match lst with
      | ->
      | x::xs -> myinsert x (isort xs)

      let showStandings (t:Table) = isort (Map.toList t)





      share|improve this answer
























        Your Answer






        StackExchange.ifUsing("editor", function () {
        StackExchange.using("externalEditor", function () {
        StackExchange.using("snippets", function () {
        StackExchange.snippets.init();
        });
        });
        }, "code-snippets");

        StackExchange.ready(function() {
        var channelOptions = {
        tags: "".split(" "),
        id: "1"
        };
        initTagRenderer("".split(" "), "".split(" "), channelOptions);

        StackExchange.using("externalEditor", function() {
        // Have to fire editor after snippets, if snippets enabled
        if (StackExchange.settings.snippets.snippetsEnabled) {
        StackExchange.using("snippets", function() {
        createEditor();
        });
        }
        else {
        createEditor();
        }
        });

        function createEditor() {
        StackExchange.prepareEditor({
        heartbeatType: 'answer',
        autoActivateHeartbeat: false,
        convertImagesToLinks: true,
        noModals: true,
        showLowRepImageUploadWarning: true,
        reputationToPostImages: 10,
        bindNavPrevention: true,
        postfix: "",
        imageUploader: {
        brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
        contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
        allowUrls: true
        },
        onDemand: true,
        discardSelector: ".discard-answer"
        ,immediatelyShowMarkdownHelp:true
        });


        }
        });














        draft saved

        draft discarded


















        StackExchange.ready(
        function () {
        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54030511%2fhow-to-use-match-map-elements-in-f%23new-answer', 'question_page');
        }
        );

        Post as a guest















        Required, but never shown

























        3 Answers
        3






        active

        oldest

        votes








        3 Answers
        3






        active

        oldest

        votes









        active

        oldest

        votes






        active

        oldest

        votes









        1














        It looks like you're confusing tuple and curried arguments.



        Examples with a single tuple argument (parenthesis are requiered).



        signature: int * int -> int



        //let example1 (a: int, b:int) = 
        let example1 (a, b) =
        match a, b with
        | 1, 2 -> 5
        | _ -> 6

        //let example2 (t: int * int) =
        let example2 t =
        match t with
        | 1, 2 -> 5
        | _ -> 6


        Example with two curried arguments:



        signature: int-> int -> int



        //let example3 (a: int) (b: int) = 
        let example3 a b =
        match a, b with
        | 1, 2 -> 5
        | _ -> 6





        share|improve this answer






























          1














          It looks like you're confusing tuple and curried arguments.



          Examples with a single tuple argument (parenthesis are requiered).



          signature: int * int -> int



          //let example1 (a: int, b:int) = 
          let example1 (a, b) =
          match a, b with
          | 1, 2 -> 5
          | _ -> 6

          //let example2 (t: int * int) =
          let example2 t =
          match t with
          | 1, 2 -> 5
          | _ -> 6


          Example with two curried arguments:



          signature: int-> int -> int



          //let example3 (a: int) (b: int) = 
          let example3 a b =
          match a, b with
          | 1, 2 -> 5
          | _ -> 6





          share|improve this answer




























            1












            1








            1







            It looks like you're confusing tuple and curried arguments.



            Examples with a single tuple argument (parenthesis are requiered).



            signature: int * int -> int



            //let example1 (a: int, b:int) = 
            let example1 (a, b) =
            match a, b with
            | 1, 2 -> 5
            | _ -> 6

            //let example2 (t: int * int) =
            let example2 t =
            match t with
            | 1, 2 -> 5
            | _ -> 6


            Example with two curried arguments:



            signature: int-> int -> int



            //let example3 (a: int) (b: int) = 
            let example3 a b =
            match a, b with
            | 1, 2 -> 5
            | _ -> 6





            share|improve this answer















            It looks like you're confusing tuple and curried arguments.



            Examples with a single tuple argument (parenthesis are requiered).



            signature: int * int -> int



            //let example1 (a: int, b:int) = 
            let example1 (a, b) =
            match a, b with
            | 1, 2 -> 5
            | _ -> 6

            //let example2 (t: int * int) =
            let example2 t =
            match t with
            | 1, 2 -> 5
            | _ -> 6


            Example with two curried arguments:



            signature: int-> int -> int



            //let example3 (a: int) (b: int) = 
            let example3 a b =
            match a, b with
            | 1, 2 -> 5
            | _ -> 6






            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Jan 4 at 7:11

























            answered Jan 4 at 6:44









            gileCADgileCAD

            1,40267




            1,40267

























                1














                In your "working code", in the pointsMade function you do not need to use pattern matching, you can simply use a let binding.



                let pointsMade (r: Result) =
                let (t1, Goals g1), (t2, Goals g2) = r
                if g1 < g2 then (t1, Points 0), (t2, Points 3)
                elif g1 = g2 then (t1, Points 1), (t2, Points 1)
                else (t1, Points 3), (t2, Points 0)


                The updateTable function also can be re-written in more concise way by using some addPoints function to avoid repeating the same thing for each team.



                let addPoints (team: Team, Points points) (table: Table) =
                match Map.tryFind team table with
                | None -> table
                | Some (Points p) -> Map.add team (Points (points + p)) table

                let updateTable (table: Table, result: Result) =
                let pts1, pts2 = pointsMade result
                table |> addPoints pts1 |> addPoints pts2





                share|improve this answer




























                  1














                  In your "working code", in the pointsMade function you do not need to use pattern matching, you can simply use a let binding.



                  let pointsMade (r: Result) =
                  let (t1, Goals g1), (t2, Goals g2) = r
                  if g1 < g2 then (t1, Points 0), (t2, Points 3)
                  elif g1 = g2 then (t1, Points 1), (t2, Points 1)
                  else (t1, Points 3), (t2, Points 0)


                  The updateTable function also can be re-written in more concise way by using some addPoints function to avoid repeating the same thing for each team.



                  let addPoints (team: Team, Points points) (table: Table) =
                  match Map.tryFind team table with
                  | None -> table
                  | Some (Points p) -> Map.add team (Points (points + p)) table

                  let updateTable (table: Table, result: Result) =
                  let pts1, pts2 = pointsMade result
                  table |> addPoints pts1 |> addPoints pts2





                  share|improve this answer


























                    1












                    1








                    1







                    In your "working code", in the pointsMade function you do not need to use pattern matching, you can simply use a let binding.



                    let pointsMade (r: Result) =
                    let (t1, Goals g1), (t2, Goals g2) = r
                    if g1 < g2 then (t1, Points 0), (t2, Points 3)
                    elif g1 = g2 then (t1, Points 1), (t2, Points 1)
                    else (t1, Points 3), (t2, Points 0)


                    The updateTable function also can be re-written in more concise way by using some addPoints function to avoid repeating the same thing for each team.



                    let addPoints (team: Team, Points points) (table: Table) =
                    match Map.tryFind team table with
                    | None -> table
                    | Some (Points p) -> Map.add team (Points (points + p)) table

                    let updateTable (table: Table, result: Result) =
                    let pts1, pts2 = pointsMade result
                    table |> addPoints pts1 |> addPoints pts2





                    share|improve this answer













                    In your "working code", in the pointsMade function you do not need to use pattern matching, you can simply use a let binding.



                    let pointsMade (r: Result) =
                    let (t1, Goals g1), (t2, Goals g2) = r
                    if g1 < g2 then (t1, Points 0), (t2, Points 3)
                    elif g1 = g2 then (t1, Points 1), (t2, Points 1)
                    else (t1, Points 3), (t2, Points 0)


                    The updateTable function also can be re-written in more concise way by using some addPoints function to avoid repeating the same thing for each team.



                    let addPoints (team: Team, Points points) (table: Table) =
                    match Map.tryFind team table with
                    | None -> table
                    | Some (Points p) -> Map.add team (Points (points + p)) table

                    let updateTable (table: Table, result: Result) =
                    let pts1, pts2 = pointsMade result
                    table |> addPoints pts1 |> addPoints pts2






                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Jan 5 at 19:02









                    gileCADgileCAD

                    1,40267




                    1,40267























                        0














                        Anyway, The code that work looks like this:



                        open System.Security.Cryptography
                        open System.Threading

                        type Team = string
                        type Goals = Goals of int
                        type Points = Points of int
                        type Fixture = Team * Team
                        type Result = (Team * Goals) * (Team * Goals)
                        type Table = Map<Team,Points>

                        let league =["Chelsea"; "Spurs"; "Liverpool"; "ManCity"; "ManUnited"; "Arsenal"; "Everton"; "Leicester"]

                        let pointsMade (a: Result)=
                        match a with
                        |((b,Goals bg),(c,Goals cg))-> if bg<cg then ((b,Points 0),(c, Points 3))
                        elif bg=cg then ((b,Points 1),(c,Points 1))
                        else ((b, Points 3),(c, Points 0))

                        let initEntry (name:Team)=(name, Points 0)

                        let initializeTable l = Map.ofList (List.map initEntry l)

                        let updateTable (t:Table, r: Result)=
                        let pointmade = pointsMade r
                        match pointmade with
                        |((f,Points s),(f1,Points s1))-> match Map.tryFind f t, Map.tryFind f1 t with
                        |None, None -> t
                        |Some x, Some y-> match x,y with
                        | Points x1 , Points y1 -> t |> Map.add f (Points(x1+s)) |> Map.add f1 (Points (y1+s1))
                        |None, Some y -> match y with
                        | Points y1 -> t.Add(f,Points s) .Add(f1, Points (s1+y1))
                        |Some x, None -> match x with
                        | Points x1 -> t.Add(f,Points (s+x1)) .Add(f1, Points s1)


                        let rec weekendUpdate (t:Table , rl:Result list)=
                        match rl with
                        |->t
                        |ai::at-> weekendUpdate(updateTable(t,ai),at)

                        let rec seasonUpdate (t:Table, sll: Result list list)=
                        match sll with
                        |->t
                        |ah::at-> seasonUpdate(weekendUpdate(t,ah),at)

                        let less((s1,n1):Team * Points, (s2,n2):Team * Points) =
                        match n1,n2 with
                        |Points m1,Points m2 ->if m1<m2 then true
                        else false

                        let rec myinsert item lst =
                        match lst with
                        | -> [item]
                        | x::xs -> if less(item,x) then x::(myinsert item xs) else item::lst

                        let rec isort lst =
                        match lst with
                        | ->
                        | x::xs -> myinsert x (isort xs)

                        let showStandings (t:Table) = isort (Map.toList t)





                        share|improve this answer




























                          0














                          Anyway, The code that work looks like this:



                          open System.Security.Cryptography
                          open System.Threading

                          type Team = string
                          type Goals = Goals of int
                          type Points = Points of int
                          type Fixture = Team * Team
                          type Result = (Team * Goals) * (Team * Goals)
                          type Table = Map<Team,Points>

                          let league =["Chelsea"; "Spurs"; "Liverpool"; "ManCity"; "ManUnited"; "Arsenal"; "Everton"; "Leicester"]

                          let pointsMade (a: Result)=
                          match a with
                          |((b,Goals bg),(c,Goals cg))-> if bg<cg then ((b,Points 0),(c, Points 3))
                          elif bg=cg then ((b,Points 1),(c,Points 1))
                          else ((b, Points 3),(c, Points 0))

                          let initEntry (name:Team)=(name, Points 0)

                          let initializeTable l = Map.ofList (List.map initEntry l)

                          let updateTable (t:Table, r: Result)=
                          let pointmade = pointsMade r
                          match pointmade with
                          |((f,Points s),(f1,Points s1))-> match Map.tryFind f t, Map.tryFind f1 t with
                          |None, None -> t
                          |Some x, Some y-> match x,y with
                          | Points x1 , Points y1 -> t |> Map.add f (Points(x1+s)) |> Map.add f1 (Points (y1+s1))
                          |None, Some y -> match y with
                          | Points y1 -> t.Add(f,Points s) .Add(f1, Points (s1+y1))
                          |Some x, None -> match x with
                          | Points x1 -> t.Add(f,Points (s+x1)) .Add(f1, Points s1)


                          let rec weekendUpdate (t:Table , rl:Result list)=
                          match rl with
                          |->t
                          |ai::at-> weekendUpdate(updateTable(t,ai),at)

                          let rec seasonUpdate (t:Table, sll: Result list list)=
                          match sll with
                          |->t
                          |ah::at-> seasonUpdate(weekendUpdate(t,ah),at)

                          let less((s1,n1):Team * Points, (s2,n2):Team * Points) =
                          match n1,n2 with
                          |Points m1,Points m2 ->if m1<m2 then true
                          else false

                          let rec myinsert item lst =
                          match lst with
                          | -> [item]
                          | x::xs -> if less(item,x) then x::(myinsert item xs) else item::lst

                          let rec isort lst =
                          match lst with
                          | ->
                          | x::xs -> myinsert x (isort xs)

                          let showStandings (t:Table) = isort (Map.toList t)





                          share|improve this answer


























                            0












                            0








                            0







                            Anyway, The code that work looks like this:



                            open System.Security.Cryptography
                            open System.Threading

                            type Team = string
                            type Goals = Goals of int
                            type Points = Points of int
                            type Fixture = Team * Team
                            type Result = (Team * Goals) * (Team * Goals)
                            type Table = Map<Team,Points>

                            let league =["Chelsea"; "Spurs"; "Liverpool"; "ManCity"; "ManUnited"; "Arsenal"; "Everton"; "Leicester"]

                            let pointsMade (a: Result)=
                            match a with
                            |((b,Goals bg),(c,Goals cg))-> if bg<cg then ((b,Points 0),(c, Points 3))
                            elif bg=cg then ((b,Points 1),(c,Points 1))
                            else ((b, Points 3),(c, Points 0))

                            let initEntry (name:Team)=(name, Points 0)

                            let initializeTable l = Map.ofList (List.map initEntry l)

                            let updateTable (t:Table, r: Result)=
                            let pointmade = pointsMade r
                            match pointmade with
                            |((f,Points s),(f1,Points s1))-> match Map.tryFind f t, Map.tryFind f1 t with
                            |None, None -> t
                            |Some x, Some y-> match x,y with
                            | Points x1 , Points y1 -> t |> Map.add f (Points(x1+s)) |> Map.add f1 (Points (y1+s1))
                            |None, Some y -> match y with
                            | Points y1 -> t.Add(f,Points s) .Add(f1, Points (s1+y1))
                            |Some x, None -> match x with
                            | Points x1 -> t.Add(f,Points (s+x1)) .Add(f1, Points s1)


                            let rec weekendUpdate (t:Table , rl:Result list)=
                            match rl with
                            |->t
                            |ai::at-> weekendUpdate(updateTable(t,ai),at)

                            let rec seasonUpdate (t:Table, sll: Result list list)=
                            match sll with
                            |->t
                            |ah::at-> seasonUpdate(weekendUpdate(t,ah),at)

                            let less((s1,n1):Team * Points, (s2,n2):Team * Points) =
                            match n1,n2 with
                            |Points m1,Points m2 ->if m1<m2 then true
                            else false

                            let rec myinsert item lst =
                            match lst with
                            | -> [item]
                            | x::xs -> if less(item,x) then x::(myinsert item xs) else item::lst

                            let rec isort lst =
                            match lst with
                            | ->
                            | x::xs -> myinsert x (isort xs)

                            let showStandings (t:Table) = isort (Map.toList t)





                            share|improve this answer













                            Anyway, The code that work looks like this:



                            open System.Security.Cryptography
                            open System.Threading

                            type Team = string
                            type Goals = Goals of int
                            type Points = Points of int
                            type Fixture = Team * Team
                            type Result = (Team * Goals) * (Team * Goals)
                            type Table = Map<Team,Points>

                            let league =["Chelsea"; "Spurs"; "Liverpool"; "ManCity"; "ManUnited"; "Arsenal"; "Everton"; "Leicester"]

                            let pointsMade (a: Result)=
                            match a with
                            |((b,Goals bg),(c,Goals cg))-> if bg<cg then ((b,Points 0),(c, Points 3))
                            elif bg=cg then ((b,Points 1),(c,Points 1))
                            else ((b, Points 3),(c, Points 0))

                            let initEntry (name:Team)=(name, Points 0)

                            let initializeTable l = Map.ofList (List.map initEntry l)

                            let updateTable (t:Table, r: Result)=
                            let pointmade = pointsMade r
                            match pointmade with
                            |((f,Points s),(f1,Points s1))-> match Map.tryFind f t, Map.tryFind f1 t with
                            |None, None -> t
                            |Some x, Some y-> match x,y with
                            | Points x1 , Points y1 -> t |> Map.add f (Points(x1+s)) |> Map.add f1 (Points (y1+s1))
                            |None, Some y -> match y with
                            | Points y1 -> t.Add(f,Points s) .Add(f1, Points (s1+y1))
                            |Some x, None -> match x with
                            | Points x1 -> t.Add(f,Points (s+x1)) .Add(f1, Points s1)


                            let rec weekendUpdate (t:Table , rl:Result list)=
                            match rl with
                            |->t
                            |ai::at-> weekendUpdate(updateTable(t,ai),at)

                            let rec seasonUpdate (t:Table, sll: Result list list)=
                            match sll with
                            |->t
                            |ah::at-> seasonUpdate(weekendUpdate(t,ah),at)

                            let less((s1,n1):Team * Points, (s2,n2):Team * Points) =
                            match n1,n2 with
                            |Points m1,Points m2 ->if m1<m2 then true
                            else false

                            let rec myinsert item lst =
                            match lst with
                            | -> [item]
                            | x::xs -> if less(item,x) then x::(myinsert item xs) else item::lst

                            let rec isort lst =
                            match lst with
                            | ->
                            | x::xs -> myinsert x (isort xs)

                            let showStandings (t:Table) = isort (Map.toList t)






                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered Jan 5 at 16:23









                            nafhgoodnafhgood

                            1619




                            1619






























                                draft saved

                                draft discarded




















































                                Thanks for contributing an answer to Stack Overflow!


                                • Please be sure to answer the question. Provide details and share your research!

                                But avoid



                                • Asking for help, clarification, or responding to other answers.

                                • Making statements based on opinion; back them up with references or personal experience.


                                To learn more, see our tips on writing great answers.




                                draft saved


                                draft discarded














                                StackExchange.ready(
                                function () {
                                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54030511%2fhow-to-use-match-map-elements-in-f%23new-answer', 'question_page');
                                }
                                );

                                Post as a guest















                                Required, but never shown





















































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown

































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown







                                Popular posts from this blog

                                Angular Downloading a file using contenturl with Basic Authentication

                                Monofisismo

                                Olmecas