В чем разница между интерпретатором и файлом .ml? - PullRequest
0 голосов
/ 20 сентября 2018

Я новичок в Ocaml, а также использую переводчик.Я сделал хороший код, который работает хорошо, но проблема в том, что поведение одного и того же кода отличается в зависимости от интерпретатора и файла .ml.Например, я сделал модуль и использовал функции для отладки.Однако, если я напишу

let (n, queue) = IntListQ.deQ(IntListQ.enQ(IntListQ.enQ(IntListQ.emptyQ, [1;2;3]), [4;5])) in
        (n, queue)

в файле .ml, он не скомпилируется и напечатает синтаксическую ошибку.С другой стороны, если я напишу выражение в интерпретаторе, запустив ocaml -init {filename} .ml, это сработает.Так в чем проблема?Почему одно и то же выражение ведет себя по-разному в файле .ml и интерпретаторе?

, чтобы сообщить подробности, что весь код выглядит следующим образом

type heap = EMPTY of rank | NODE of rank * value * heap * heap
and rank =int
and value=int

exception EmptyHeap

let rank : heap -> rank = fun i ->
    match i with
    | EMPTY _ -> -1
    | NODE (r, _, _ ,_) -> r

(****print heap expression****)

module type Queue =  
    sig
        type element
        type queue
        exception EMPTY_Q
        val emptyQ: queue
        val enQ: queue * element -> queue
        val deQ: queue -> element * queue   
        val isempty : queue -> bool
    end

module IntListQ  = 
    struct
        type element = heap
        type queue = heap list * heap list(*element list??*)
        exception EMPTY_Q

        let emptyQ : heap list * heap list = ([],[])

        let enQ: (heap list * heap  list) * heap ->  heap  list * heap  list = fun (que , ele)->
            let (first, second) = que in
            let new_second = List.append second (List.rev first) in
            (ele::[] ,new_second)

        let deQ: (heap  list * heap  list) -> heap * (heap list * heap  list) = fun que ->
        match que with
        | ([], []) -> raise EMPTY_Q
        | _ ->
            let (first, second) = que in
            let new_second = List.append second (List.rev first) in
            let out = List.hd new_second in
            (out, ([],List.tl new_second))

        let isemtpy: heap list * heap list -> bool = fun i ->
            match i with
            | ([], []) -> true
            | _ -> false
    end

let printhpst : heap -> unit = fun x ->
    let startq = ref IntListQ.emptyQ    
    startq := IntListQ.enQ !startq (EMPTY -1)
    let tim = ref false in
        while  !tim do
            let n = startq.deQ
            printhp n;
            match n with
            | NODE (i, j, k, l) -> 
            begin
                startq := IntListQ.enQ !startq k
                startq := IntListQ.enQ !startq l
            end
            | EMPTY 0-> ()
            | EMPTY -1 -> startq := IntListQ.enQ !startq EMPTY -1

            tim := IntListQ.isempty startq
        done

let printhp : heap -> unit = fun hp ->
    match hp with
    |EMPTY  _ -> print_endline "EMPTY";
    |NODE (i, j, k, l) -> (print_endline ("( "^(string_of_int i)^" , "^(string_of_int j)^" , "^(string_of_int (rank k))^" , "^(string_of_int (rank l))^" )"););;

let findMin h = 
    (match h with
    | EMPTY _ -> raise EmptyHeap
    | (NODE(_,x,_,_)) -> x);;

let shake (x, lh, rh) = 
    print_endline "shake";
    if(rank lh) >= (rank rh)
    then NODE(rank rh+1, x, lh, rh)
    else NODE(rank lh+1, x, rh, lh)

let rec merge : heap * heap -> heap = fun (lh, rh)->
    match (lh, rh) with
    | ( EMPTY _ , EMPTY _ ) -> print_endline "merge: EMPTY Empty"; printhp lh; printhp rh; print_endline "_____________________";EMPTY 0
    | ( EMPTY _, NODE (i, j, k, l) )
    | (NODE (i, j, k, l), EMPTY _ ) -> print_endline "merge:NODE"; printhp lh; printhp rh; print_endline "_____________________"; NODE ( i, j, k, l )
    | (NODE _, NODE _ )->
        print_endline "merge:NODE NODE";
        printhp lh;
        printhp rh;
        print_endline "_____________________";
        let minlh = findMin lh in
        let minrh = findMin rh in

        if minlh<=minrh then 

            (print_endline "minlh<=minrh";
            print_endline "_____________________";
            let dellh = deleteMin lh in
            shake (minlh, dellh, rh))

        else
            (print_endline "minlh>minrh";
            print_endline "_____________________";
            let delrh= deleteMin rh in
            shake (minrh, delrh, lh))

and insert : rank*heap -> heap = fun (x, h )->
    merge(h, NODE( 0, x, EMPTY 0, EMPTY 0))

and deleteMin h = 
    print_endline "deleteMin";
    printhp h;
    print_endline "_____________________";
    match h with
    | EMPTY _ -> raise EmptyHeap
    | NODE(_, x , lh, rh) -> merge (lh, rh)

(* try basic 
  let heap1 = NODE(0, 2, EMPTY, EMPTY) in
  let heap2 = NODE(0, 3, EMPTY, EMPTY) in
  findMin(merge (heap1, heap2));;
   *)

1 Ответ

0 голосов
/ 20 сентября 2018

Чтобы получить полезный ответ, вам нужно дать более подробную информацию, включая определение IntListQ.

Если интерпретатор (OCaml toplevel) и компилятор (ocamlc / ocamlopt) не согласились с языком, это, вероятно,к настоящему времени замечены.

Наиболее распространенная причина неожиданного поведения интерпретатора заключается в том, что при загрузке файла в интерпретаторе существовали некоторые определения.Если вы попытаетесь снова запустить интерпретатор с нуля для теста, вы можете увидеть более последовательное поведение.

...