Что такое модуль, исключение, FI и UNKNOWN в реализации TAPL OCaml?

Я читаю книгу Типы и языки программирования (https://www.cis.upenn.edu/%7Ebcpierce/tapl/).

В главе 4, Реализация арифметических выражений на ML, он представил info. Я скачал исходный код ocaml arith.tar.gz здесь: https://www.cis.upenn.edu/%7Ebcpierce/tapl/checkers./.

Вот начало support.ml:

open Format

module Error = struct

exception Exit of int

type info = FI of string * int * int | UNKNOWN

У меня есть несколько вопросов:

Q1

Я установил utop (версия 2.6.0) с последним хоумбрю на MacOS, установил библиотеки с opam install core base. Вот мой .ocamlinit:

#use "topfind";;
#thread;;
#require "core.top";;

open Base;;
open Core;;

он дает мне предупреждения:

utop # open Format;;
Line 1, characters 5-11:
Alert deprecated: module Base.Format
[2016-09] this element comes from the stdlib distributed with OCaml.
[Base] doesn't export a [Format] module, although the
[Caml.Format.formatter] type is available (as [Formatter.t])
for interaction with other libraries.

utop # open Base.Format;;
Line 1, characters 5-16:
Alert deprecated: module Base.Format
[2016-09] this element comes from the stdlib distributed with OCaml.
[Base] doesn't export a [Format] module, although the
[Caml.Format.formatter] type is available (as [Formatter.t])
for interaction with other libraries.

Что такое библиотека Format и Base.Format? Мне все еще нужно открывать их сейчас?

Q2

module Error = struct застрял в интерпретаторе utop. Что означает эта строка? Почему он застрял в utop?

Q3

Что означает exception Exit of int?

Q4

Что такое FI и UNKNOWN в type info = FI of string * int * int | UNKNOWN?


person linrongbin    schedule 21.12.2020    source источник


Ответы (1)


Q1: вы должны использовать Base.Caml.Format (или Core.Caml.Format) вместо Base.Format (или просто отказаться от base/core).

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

module M = struct
  type t = ...
  let f = ...
end

Таким образом, структура должна обозначать начало содержимого модуля. utop ожидает, что вы наберете то, что будет дальше.

Q3: необходимо объявить исключение с именем Exit, которое поставляется с целым числом, пример использования:

exception Exit of int

let f () = raise (Exit 1)

let () =
  try
    f ()
  with
  | Exit n -> Format.printf "exit %d@." n

Q4: это тип суммы, состоящий из двух случаев, FI и UNKNOWN, первый из которых имеет строку и пример использования двух целых чисел:

type info =
  | FI of string * int * int
  | UNKNOWN

let print x =
  match x with
  | FI (s, i1, i2) -> Format.printf "FI (%s, %d, %d)" s i1 i2
  | UNKNOWN -> Format.printf "UNKNOWN"

let () =
  print (FI ("hello", 1, 2));
  print UNKNOWN
person yehudi    schedule 27.01.2021