简体   繁体   中英

Unknown Type Error in OCaml

I'm attempting to create a new list of all the unique items from another list. My in_list function works properly and returns a value saying whether or not the value is found in the seen_list, but I can't for the life of me get this to compile.

let uniq x = match in_list x seen_list with
    | true -> seen_list
    | false -> seen_list@[x]
    | _ -> seen_list
;;

List.iter uniq check_list;;

The problem is some sort of type error. Here it is:

Error: This expression has type int -> int list
       but an expression was expected of type int -> unit
       Type int list is not compatible with type unit 

In essence you want to take the result returned by uniq and pass it as the list for the next call of uniq . To do this, you need to use a fold, or write your own recursion. The purpose of List.iter is just to call an imperative function for each element of a list. It doesn't combine the answers in any way. That's why you're getting a type error—your function isn't imperative. Ie, it doesn't return unit.

Perhaps this is what you want:

let rec uniq_list lst =
  match lst with
  | [] -> []
  | x :: xs ->
      let r = uniq_list xs in
      if in_list x r then r else x :: r

Or, using List.fold_right (equivalent to the recursive function above):

let uniq_list lst =
  List.fold_right
    (fun x r -> if in_list x r then r else x :: r)
    lst
    []

Or using List.fold_left which is tail-recursive:

let uniq_list lst =
  List.fold_left
    (fun r x -> if in_list x r then r else x :: r)
    []
    lst

By the way, your in_list is equivalent to the standard library function List.mem .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM