-1
я объявил следующую функцию в интерфейсеOCaml получает сумасшедшие о типах
type t
val empty : t
val mem : int -> t -> bool
Теперь я пытаюсь позвонить
open ISet
open OUnit2
open Printf
open List
(* ... *)
let s = mem 8 empty
Но то, что я получаю
This expression has type ISet.t but an expression was expected of type
int list
Какого черта продолжается?? я даже явно определить типы в файле .ml
let mem (x : int) (set : t) =
let rec loop = function
| Node (l, k, r, _) ->
let c = cmp_val k x in
(contains k x) || loop (if c < 0 then l else r)
| Empty -> false in
loop set
Я полностью согласен, но это выглядит как mem указывает на ISet.mem. Нет ничего с этим именем, которое поставляется с OCaml. Это говорит о том, что в описании проблемы ОП отсутствует * много * контекста. –
Действительно, я не знал, что существует такая вещь, как 'List.mem'. Спасибо, что указали это. – marmistrz
Операторы '' open'' очень полезны, если вы хотите переопределить поведение по умолчанию. В противном случае я бы предложил использовать систематически вместо точечной нотации ('' Iset.mem''), чтобы избежать такой путаницы. –