Пояснения OCaml Warnings - PullRequest
       6

Пояснения OCaml Warnings

3 голосов
/ 23 марта 2019

Я просматривал список предупреждений OCaml и не уверен, что означают некоторые из них (примеры не приводятся). В частности, я хотел бы понять:

Примеры кода, который вызывает следующие предупреждения (я думаю, что моя интерпретация того, что означает каждое предупреждение, отличается от того, что оно на самом деле означает, потому что мне трудно создавать случаи, которые вызывают предупреждения, которые не являются прямыми языковыми ошибками):

5.  Partially applied function: expression whose result has function type and is ignored.
6.  Label omitted in function application.
28. Wildcard pattern given as argument to a constant constructor.
59. Assignment to non-mutable value

Что такое "переменная предка" и "конструктор расширения":

36. Unused ancestor variable.
38. Unused extension constructor.

Что это значит:

61. Unboxable type in primitive declaration
62. Type constraint on GADT type declaration

Ответы [ 2 ]

5 голосов
/ 24 марта 2019

Для завершения списка:

  1. Шаблон подстановочного знака может использоваться в качестве аргумента конструктора без аргументов

    type t = A
    let f x = match x with A _ -> 0
    

Предупреждение 28: шаблон подстановочного знака, переданный в качестве аргумента конструктору констант

  1. Это предупреждение возникает, когда кто-то называет унаследованный класс, не используя его:

    class c = object end
    class d = object
       inherit c as super
    end
    

Предупреждение 36: неиспользуемая переменная предка super.

  1. Конструкция расширения - это конструктор, добавляемый к типу расширяемой суммы, например exn

    module M:sig end = struct
      type exn += Unused
     end
    

Предупреждение 38: неиспользованное исключение Не используется

  1. В последних версиях OCaml можно избежать записи в бокс только с одним типом поля или варианта с одним конструктором. Эта распаковка в настоящее время требует аннотации

    type t = I of int [@@unboxed]
    

Однако представление по умолчанию может измениться в будущем. Это изменение является прозрачным, за исключением FFI. Это означает, что внешние являются особенно хрупкими, если они включают тип без аннотации:

  type t = I of int
  external id: t -> t = "%identity"

Предупреждение 61: Это примитивное объявление использует тип t, который не аннотирован и unboxable. Представление таких типов может измениться в будущем версии. Вы должны аннотировать объявление t с помощью [@@ boxed] или [@@ unboxed].

  1. Ограничения типа не применяются к аргументам GADT при определении типа варианта. Например, в

    type 'a t = 
    | A: 'a -> float t 
    | B of 'a
    constraint 'a = float
    

Предупреждение 62: Ограничения типов не применяются к случаям GADT вариантов типов.

Предупреждение объясняет, что B [] является ошибкой, тогда как A[] в порядке.

  1. Это предупреждение является внутренним предупреждением фламбды, которое предупреждает о том, что значение, которое, как предполагалось, фламбда не является изменяемым, фактически было изменчивым. Это предупреждение не следует выдавать в обычных обстоятельствах.
4 голосов
/ 23 марта 2019

Вот пример для предупреждения 5:

# let f a b = a + b;;
val f : int -> int -> int = <fun>
# ignore (f 3);;
Warning 5: this function application is partial,
maybe some arguments are missing.
- : unit = ()

Предупреждение 6 по умолчанию отключено.Если вы включите его, его легко получить:

$ rlwrap ocaml -w +6
        OCaml version 4.06.1
# let f ~a = a * 10;;
val f : a:int -> int = <fun>
# f 3;;
Warning 6: label a was omitted in the application of this function.
- : int = 30

Остальное выходит за рамки того, что я могу понять, не глядя на исходники компилятора.Может быть, появится один или два эксперта, которые могут привести примеры для них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...