Elm: How to merge two dictionaries?












5














I have two dictionaries, and their values incidcate type effectiveness of a Pokémon attack. Now I want to combine these to have the combined effectiveness.



So for instance, one dictionary has:



 normal -> 0.5
fire -> 2


The other has:



 water-> 0.5
fire -> 2


The combined would be:



 normal -> 0.5
water-> 0.5
fire -> 4


I found a function for dict called merge: https://package.elm-lang.org/packages/elm/core/1.0.2/Dict#merge, but can't figure out how to use it, nor could I find an example.



So, how do you use Dict.merge? Could you provide an example?










share|improve this question



























    5














    I have two dictionaries, and their values incidcate type effectiveness of a Pokémon attack. Now I want to combine these to have the combined effectiveness.



    So for instance, one dictionary has:



     normal -> 0.5
    fire -> 2


    The other has:



     water-> 0.5
    fire -> 2


    The combined would be:



     normal -> 0.5
    water-> 0.5
    fire -> 4


    I found a function for dict called merge: https://package.elm-lang.org/packages/elm/core/1.0.2/Dict#merge, but can't figure out how to use it, nor could I find an example.



    So, how do you use Dict.merge? Could you provide an example?










    share|improve this question

























      5












      5








      5







      I have two dictionaries, and their values incidcate type effectiveness of a Pokémon attack. Now I want to combine these to have the combined effectiveness.



      So for instance, one dictionary has:



       normal -> 0.5
      fire -> 2


      The other has:



       water-> 0.5
      fire -> 2


      The combined would be:



       normal -> 0.5
      water-> 0.5
      fire -> 4


      I found a function for dict called merge: https://package.elm-lang.org/packages/elm/core/1.0.2/Dict#merge, but can't figure out how to use it, nor could I find an example.



      So, how do you use Dict.merge? Could you provide an example?










      share|improve this question













      I have two dictionaries, and their values incidcate type effectiveness of a Pokémon attack. Now I want to combine these to have the combined effectiveness.



      So for instance, one dictionary has:



       normal -> 0.5
      fire -> 2


      The other has:



       water-> 0.5
      fire -> 2


      The combined would be:



       normal -> 0.5
      water-> 0.5
      fire -> 4


      I found a function for dict called merge: https://package.elm-lang.org/packages/elm/core/1.0.2/Dict#merge, but can't figure out how to use it, nor could I find an example.



      So, how do you use Dict.merge? Could you provide an example?







      dictionary elm






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 22 at 18:16









      The Oddler

      2,65022463




      2,65022463
























          1 Answer
          1






          active

          oldest

          votes


















          8














          The signature might be confusing you because it isn't restricted to merging into a new Dict, but could merge into a list of key-value pairs instead, for example. When reading the signature in your case you can replace result with Dict comparable c. or even use Int in place of both a, b and c.



          Edit: For easy reference, the signature is:



          merge :
          (comparable -> a -> result -> result)
          -> (comparable -> a -> b -> result -> result)
          -> (comparable -> b -> result -> result)
          -> Dict comparable a
          -> Dict comparable b
          -> result
          -> result


          When using it, in order to return an new Dict we have to pass it Dict.empty as the initial value and insert the values into the dictionary in each function ourselves, like this:



          dictA =
          Dict.fromList [ ( "normal", 0.5 ), ( "fire", 2 ) ]


          dictB =
          Dict.fromList [ ( "water", 0.5 ), ( "fire", 2 ) ]


          merged =
          Dict.merge
          (key a -> Dict.insert key a)
          (key a b -> Dict.insert key (a + b))
          (key b -> Dict.insert key b)
          dictA
          dictB
          Dict.empty





          share|improve this answer























          • First and third arguments to Dict.merge can be eta-reduced to Dict.insert. Nice answer.
            – user633183
            Dec 1 at 2:42











          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%2f53436370%2felm-how-to-merge-two-dictionaries%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          8














          The signature might be confusing you because it isn't restricted to merging into a new Dict, but could merge into a list of key-value pairs instead, for example. When reading the signature in your case you can replace result with Dict comparable c. or even use Int in place of both a, b and c.



          Edit: For easy reference, the signature is:



          merge :
          (comparable -> a -> result -> result)
          -> (comparable -> a -> b -> result -> result)
          -> (comparable -> b -> result -> result)
          -> Dict comparable a
          -> Dict comparable b
          -> result
          -> result


          When using it, in order to return an new Dict we have to pass it Dict.empty as the initial value and insert the values into the dictionary in each function ourselves, like this:



          dictA =
          Dict.fromList [ ( "normal", 0.5 ), ( "fire", 2 ) ]


          dictB =
          Dict.fromList [ ( "water", 0.5 ), ( "fire", 2 ) ]


          merged =
          Dict.merge
          (key a -> Dict.insert key a)
          (key a b -> Dict.insert key (a + b))
          (key b -> Dict.insert key b)
          dictA
          dictB
          Dict.empty





          share|improve this answer























          • First and third arguments to Dict.merge can be eta-reduced to Dict.insert. Nice answer.
            – user633183
            Dec 1 at 2:42
















          8














          The signature might be confusing you because it isn't restricted to merging into a new Dict, but could merge into a list of key-value pairs instead, for example. When reading the signature in your case you can replace result with Dict comparable c. or even use Int in place of both a, b and c.



          Edit: For easy reference, the signature is:



          merge :
          (comparable -> a -> result -> result)
          -> (comparable -> a -> b -> result -> result)
          -> (comparable -> b -> result -> result)
          -> Dict comparable a
          -> Dict comparable b
          -> result
          -> result


          When using it, in order to return an new Dict we have to pass it Dict.empty as the initial value and insert the values into the dictionary in each function ourselves, like this:



          dictA =
          Dict.fromList [ ( "normal", 0.5 ), ( "fire", 2 ) ]


          dictB =
          Dict.fromList [ ( "water", 0.5 ), ( "fire", 2 ) ]


          merged =
          Dict.merge
          (key a -> Dict.insert key a)
          (key a b -> Dict.insert key (a + b))
          (key b -> Dict.insert key b)
          dictA
          dictB
          Dict.empty





          share|improve this answer























          • First and third arguments to Dict.merge can be eta-reduced to Dict.insert. Nice answer.
            – user633183
            Dec 1 at 2:42














          8












          8








          8






          The signature might be confusing you because it isn't restricted to merging into a new Dict, but could merge into a list of key-value pairs instead, for example. When reading the signature in your case you can replace result with Dict comparable c. or even use Int in place of both a, b and c.



          Edit: For easy reference, the signature is:



          merge :
          (comparable -> a -> result -> result)
          -> (comparable -> a -> b -> result -> result)
          -> (comparable -> b -> result -> result)
          -> Dict comparable a
          -> Dict comparable b
          -> result
          -> result


          When using it, in order to return an new Dict we have to pass it Dict.empty as the initial value and insert the values into the dictionary in each function ourselves, like this:



          dictA =
          Dict.fromList [ ( "normal", 0.5 ), ( "fire", 2 ) ]


          dictB =
          Dict.fromList [ ( "water", 0.5 ), ( "fire", 2 ) ]


          merged =
          Dict.merge
          (key a -> Dict.insert key a)
          (key a b -> Dict.insert key (a + b))
          (key b -> Dict.insert key b)
          dictA
          dictB
          Dict.empty





          share|improve this answer














          The signature might be confusing you because it isn't restricted to merging into a new Dict, but could merge into a list of key-value pairs instead, for example. When reading the signature in your case you can replace result with Dict comparable c. or even use Int in place of both a, b and c.



          Edit: For easy reference, the signature is:



          merge :
          (comparable -> a -> result -> result)
          -> (comparable -> a -> b -> result -> result)
          -> (comparable -> b -> result -> result)
          -> Dict comparable a
          -> Dict comparable b
          -> result
          -> result


          When using it, in order to return an new Dict we have to pass it Dict.empty as the initial value and insert the values into the dictionary in each function ourselves, like this:



          dictA =
          Dict.fromList [ ( "normal", 0.5 ), ( "fire", 2 ) ]


          dictB =
          Dict.fromList [ ( "water", 0.5 ), ( "fire", 2 ) ]


          merged =
          Dict.merge
          (key a -> Dict.insert key a)
          (key a b -> Dict.insert key (a + b))
          (key b -> Dict.insert key b)
          dictA
          dictB
          Dict.empty






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 22 at 19:09

























          answered Nov 22 at 18:35









          glennsl

          9,601102746




          9,601102746












          • First and third arguments to Dict.merge can be eta-reduced to Dict.insert. Nice answer.
            – user633183
            Dec 1 at 2:42


















          • First and third arguments to Dict.merge can be eta-reduced to Dict.insert. Nice answer.
            – user633183
            Dec 1 at 2:42
















          First and third arguments to Dict.merge can be eta-reduced to Dict.insert. Nice answer.
          – user633183
          Dec 1 at 2:42




          First and third arguments to Dict.merge can be eta-reduced to Dict.insert. Nice answer.
          – user633183
          Dec 1 at 2:42


















          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.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • 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%2f53436370%2felm-how-to-merge-two-dictionaries%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

          What visual should I use to simply compare current year value vs last year in Power BI desktop

          How to ignore python UserWarning in pytest?

          Alexandru Averescu