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
;;
compiler-errors ocaml type-inference operator-precedence
add a comment |
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
;;
compiler-errors ocaml type-inference operator-precedence
add a comment |
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
;;
compiler-errors ocaml type-inference operator-precedence
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
compiler-errors ocaml type-inference operator-precedence
edited Nov 9 at 19:51
glennsl
8,823102545
8,823102545
asked Nov 9 at 19:42
mvxxx
31
31
add a comment |
add a comment |
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.
add a comment |
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.
add a comment |
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.
add a comment |
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.
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.
edited Nov 9 at 19:57
answered Nov 9 at 19:48
glennsl
8,823102545
8,823102545
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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