2015-12-08 2 views
-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 

ответ

2

вы могли бы предоставить больше кода? t является абстрактным типом, поэтому я предполагаю, что вы должны его определить. Я подозреваю также, что mem не является правильным mem и указывает на List.mem.

+0

Я полностью согласен, но это выглядит как mem указывает на ISet.mem. Нет ничего с этим именем, которое поставляется с OCaml. Это говорит о том, что в описании проблемы ОП отсутствует * много * контекста. –

+0

Действительно, я не знал, что существует такая вещь, как 'List.mem'. Спасибо, что указали это. – marmistrz

+0

Операторы '' open'' очень полезны, если вы хотите переопределить поведение по умолчанию. В противном случае я бы предложил использовать систематически вместо точечной нотации ('' Iset.mem''), чтобы избежать такой путаницы. –

Смежные вопросы