2009/2/22 Su Zhang <westlifezs@gmail.com>
Hi all,I have a problem while executing ocaml, did you see any problem in my code?Yes, a few. See below.and do I need to give each variable a type before I use it ?Generally speaking, no. There are a few cases where it needs to be done, or it helps to specify types, but most of the time the types will be inferred for you.my code is in the following, you can take a look at the code and the info of the errorslet rec first(x, y, z)=x
let rec second(x,y,z)=y
let rec third(x,y,z)=z
It's not an error, but there's no need for rec here. These aren't recursive functions.
let rec rebuilt anss (m,n,ys)= match anss with
[] -> (m,n,ys)
|element::anss ->
if m>first(element ) and n< second(element)
then rebuilt anss (m,n,ys)
else element::(rebuild anss (m,n,ys))
Three problems here:1: You alternate between calling this function rebuilt and rebuild.2: The "and" in the fourth line should be "&&". The "and" keyword is used for recursive definitions.3: You have a type error in this definition. in the first pattern, the return type of the function is 'a * 'b * 'c, but in the else branch of the second pattern, you return an ('a * 'b * 'c) list.Assuming that you want to return a list, a more idiomatic way to write this function is:let rec rebuild anss ((m,n,_) as tup) =match anss with| [] -> [tup]| (x,y,_)::t when m > x && n < y -> rebuild t tup| h::t -> h::(rebuild t tup);;Note how you can use pattern matching to eliminate the need for your first, second, and third functions.Of course, you may also want to look at the functions in the standard library's List module (in particular List.filter) which likely make writing functions like his much easier.
let rec sum anss cur n ys= match cur with
None ->
(match ys with
[]-> anss
|y::ys->
if y=0
then sum(rebuild anss (n,n,0)) None n+1 ys
else sum anss (Some(n, y, [y])) (n + 1) ys)
the red area is shown has an error, and the error info is like this:"This expression has type int list -> 'a but is here used with type int", so would you please let me know if possible how can I let the compiler know the type of anss is a list but not an integrer?The problem here is that the part in red is being parsed as (sum ( rebuild anss (n,n,0)) None n) + 1 ys. To fix this, you need to put the n+1 in parens.Finally, questions like this are better asked on the OCaml Beginner's list . You may want to join that list as well and use it for your questions while you learn OCaml.William D. Neumann