Need help please about some exercices

hi e erybody
i have a list [“first” ; “second” ; “three”]

i want to return this list without the last element like that :retourne [“first” ; “second” ]*)

I try this but something doesn’t function:

let rec remove_last l =
  let lgth = List_length l in
  let ret = [] in
  if lgth < 2 then ret
  else List.hd l :: remove_last (List.tl l);;

print_string (remove_last l ["first" ; "second" ; "last"]);;

Please tell us what doesn’t work and the error messages you see, it makes it easier for us to help you.

In this case I suspect you need to replace List_length by List.length and your code should be right.

However note that calling List.length l on each recursive call needs to go through the whole l which is inefficient (see the implementation of List.length).

This is a case where you should use pattern matching. Here’s the structure, I’ll let you fill in the blanks:

let rec remove_last l = match l with
| [] -> …
| [v] -> …
| v :: vs -> …
2 Likes

i have this error "Error: This function has type 'a list → ‘a list
It is applied to too many arguments; maybe you forgot a `;’.

by the way I prefer to avoid the function match with

Ah it’s here:

you need to remove that l :–)

you say I have to cancel all this line or only the ‘l’
sorry I m beginner and I don’t understand any about this language

The way to work with lists is to use pattern matching:

let rec remove_last = function
  | [] | [_] -> []
  | x :: xs -> x :: remove_last xs

If you don’t understand anything about the language, then it may be a good idea to start by reading about the basics, I recommend OCaml from the Very Beginning.

Cheers,
Nicolas


The ocaml type system is like this toy for children, you can not put a triangle in the square shape.

Here remove_last returns a string list, but print_string expects a string.

So here you can use List.iter to apply print_string on every elements of the list, or you can also use String.concat to concatenate every string of the list into a single string:

$ ocaml
# let rec remove_last = function
  | [] | [_] -> []
  | x :: xs -> x :: remove_last xs
  ;;
val remove_last : 'a list -> 'a list = <fun>

# print_string (remove_last ["first" ; "second" ; "last"]) ;;
Error: This expression has type string list
       but an expression was expected of type string

# List.iter print_string (remove_last ["first" ; "second" ; "last"]) ;;
firstsecond
- : unit = ()

# print_string (
    String.concat " " (remove_last ["first"; "second"; "last"])) ;;
first second
- : unit = ()

(copy-pasted from the toplevel)

$ ocaml
# List.iter ;;
- : ('a -> unit) -> 'a list -> unit = <fun>

# String.concat ;;
- : string -> string list -> string = <fun>

please i would like to returns [first,second] and. not first second

Please tell us why you’re not able to figure out how to change the example, to fit what you want.

The answer is quite simple, just replace the space " " by a comma "," and use the concatanation operator ^:

# let s = String.concat "," (remove_last ["first"; "second"; "last"]) ;;
val s : string = "first,second"

# print_endline ("[" ^ s ^ "]") ;;
[first,second]
- : unit = ()