Ocaml - matching two lists









up vote
0
down vote

favorite












I am trying to write a shuffle function in OCaml, but there is a problem with type inference. Merlin tells me that l1 and l2 are of type 'a list list, which is not true because they are only 'a list. Why does it claims that?



let shuffle l1 l2 =
let rec scan l1 l2 acc =
match (l1, l2) with
| , -> acc
| (,h2::t2) -> scan t2 h2::acc
| (h1::t1, ) -> scan t1 h1::acc
| (h1::t1,h2::t2) -> scan t1 t2 h1::h2::acc
in scan l1 l2
;;









share|improve this question



























    up vote
    0
    down vote

    favorite












    I am trying to write a shuffle function in OCaml, but there is a problem with type inference. Merlin tells me that l1 and l2 are of type 'a list list, which is not true because they are only 'a list. Why does it claims that?



    let shuffle l1 l2 =
    let rec scan l1 l2 acc =
    match (l1, l2) with
    | , -> acc
    | (,h2::t2) -> scan t2 h2::acc
    | (h1::t1, ) -> scan t1 h1::acc
    | (h1::t1,h2::t2) -> scan t1 t2 h1::h2::acc
    in scan l1 l2
    ;;









    share|improve this question

























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      I am trying to write a shuffle function in OCaml, but there is a problem with type inference. Merlin tells me that l1 and l2 are of type 'a list list, which is not true because they are only 'a list. Why does it claims that?



      let shuffle l1 l2 =
      let rec scan l1 l2 acc =
      match (l1, l2) with
      | , -> acc
      | (,h2::t2) -> scan t2 h2::acc
      | (h1::t1, ) -> scan t1 h1::acc
      | (h1::t1,h2::t2) -> scan t1 t2 h1::h2::acc
      in scan l1 l2
      ;;









      share|improve this question















      I am trying to write a shuffle function in OCaml, but there is a problem with type inference. Merlin tells me that l1 and l2 are of type 'a list list, which is not true because they are only 'a list. Why does it claims that?



      let shuffle l1 l2 =
      let rec scan l1 l2 acc =
      match (l1, l2) with
      | , -> acc
      | (,h2::t2) -> scan t2 h2::acc
      | (h1::t1, ) -> scan t1 h1::acc
      | (h1::t1,h2::t2) -> scan t1 t2 h1::h2::acc
      in scan l1 l2
      ;;






      compiler-errors ocaml type-inference operator-precedence






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 9 at 19:51









      glennsl

      8,823102545




      8,823102545










      asked Nov 9 at 19:42









      mvxxx

      31




      31






















          1 Answer
          1






          active

          oldest

          votes

















          up vote
          1
          down vote



          accepted










          The root cause is that operator precedence isn't determined by your grouping by whitespace. That is, scan t2 h2::acc is interpreted as (scan t2 h2)::acc, not scan t2 (h2::acc), because function application has a higher precedence than ::. The fix is simply to add parentheses where appropriate.



          See this table for the precedence and associativity of the different operators in OCaml.






          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',
            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%2f53232312%2focaml-matching-two-lists%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








            up vote
            1
            down vote



            accepted










            The root cause is that operator precedence isn't determined by your grouping by whitespace. That is, scan t2 h2::acc is interpreted as (scan t2 h2)::acc, not scan t2 (h2::acc), because function application has a higher precedence than ::. The fix is simply to add parentheses where appropriate.



            See this table for the precedence and associativity of the different operators in OCaml.






            share|improve this answer


























              up vote
              1
              down vote



              accepted










              The root cause is that operator precedence isn't determined by your grouping by whitespace. That is, scan t2 h2::acc is interpreted as (scan t2 h2)::acc, not scan t2 (h2::acc), because function application has a higher precedence than ::. The fix is simply to add parentheses where appropriate.



              See this table for the precedence and associativity of the different operators in OCaml.






              share|improve this answer
























                up vote
                1
                down vote



                accepted







                up vote
                1
                down vote



                accepted






                The root cause is that operator precedence isn't determined by your grouping by whitespace. That is, scan t2 h2::acc is interpreted as (scan t2 h2)::acc, not scan t2 (h2::acc), because function application has a higher precedence than ::. The fix is simply to add parentheses where appropriate.



                See this table for the precedence and associativity of the different operators in OCaml.






                share|improve this answer














                The root cause is that operator precedence isn't determined by your grouping by whitespace. That is, scan t2 h2::acc is interpreted as (scan t2 h2)::acc, not scan t2 (h2::acc), because function application has a higher precedence than ::. The fix is simply to add parentheses where appropriate.



                See this table for the precedence and associativity of the different operators in OCaml.







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Nov 9 at 19:57

























                answered Nov 9 at 19:48









                glennsl

                8,823102545




                8,823102545



























                     

                    draft saved


                    draft discarded















































                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53232312%2focaml-matching-two-lists%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

                    Kleinkühnau

                    Makov (Slowakei)

                    Deutsches Schauspielhaus