Два поля двух записей имеют одинаковую метку в OCaml - PullRequest
8 голосов
/ 19 января 2012

Я определил два типа записей:

type name =
    { r0: int; r1: int; c0: int; c1: int;
      typ: dtype;
      uid: uid (* key *) }

and func =
    { name: string;
      typ: dtype;
      params: var list;
      body: block }

И позже я получил ошибку для строки кода: Error: The record field label typ belongs to the type Syntax.func but is mixed here with labels of type Syntax.name

Может кто-нибудь сказать мне, если мы не должны иметьдва поля двух записей имеют одинаковую метку, например typ, что приводит в замешательство компилятор.

Ответы [ 3 ]

13 голосов
/ 19 января 2012

Нет, вы не можете, потому что это нарушит вывод типа.

Кстати, вы можете использовать пространство имен модуля, чтобы исправить это:

module Name = struct
  type t = { r0:int; ... }
end

module Func = struct
  type t = { name: string; ... }
end

А потом, вы можете поставить префикс в полеимя справа от модуля:

let get_type r = r.Name.typ
let name = { Name.r0=1; r1=2; ... }
let f = { Func.name="foo"; typ=...; ... }

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

8 голосов
/ 19 января 2012

Язык Ocaml требует, чтобы все поля внутри модуля имели разные имена. В противном случае он не сможет определить тип функции ниже

let get_typ r = r.typ ;;

потому что это может быть тип name -> dtype или тип func -> dtype

Кстати, я предлагаю вам иметь суффикс типа _t для всех имен ваших типов.

1 голос
/ 15 марта 2018

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

let get_name_type (n:name) = n.typ

let get_func_type (f:func) = f.typ
...