Arhn - архитектура программирования

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

скажем, у меня есть

type t = A of int | B of int

let xx = A(2);;
let yy = A(3);;

и я хочу проверить, равны ли конструкторы xx и yy, есть ли простой способ сделать это? Вместо того, чтобы

match xx with
  A _ ->
  (match yy with A _ -> true | B _ -> false)
| B _ -> 
  (match yy with A _ -> false | B _ -> true);;

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

29.06.2011

Ответы:


1

Вы можете переписать приведенное выше, несколько проще:

match xx, yy with
| A _, A _
| B _, B _ -> true
| (A _ | B _), _ -> false

но я не знаю решения без перечисления всех конструкторов.

29.06.2011
  • Это правильно, хотя часто разумнее избегать _,_ и лучше использовать (A _ | B _ ), _. Таким образом, если конструктор изменится, компилятор может помочь вам найти ошибки. Обсуждается это, stackoverflow.com /вопросы/4346901/ 29.06.2011
  • это можно сделать, сравнив теги значений (довольно безопасно с правильными аннотациями типов) :) 29.06.2011
  • @niucaroni: действительно, очень хороший момент. Я взял на себя смелость включить это в ответ. 29.06.2011

  • 2

    Это возможно, вроде, через модуль Obj. Анализ объектов с помощью функций Obj, если все сделано правильно, не приведет к сбою вашей программы; но вам нужно быть осторожным, если вы хотите получить значимые результаты.

    let equal_constructors (x : 'a) (y : 'a) =
      let r = Obj.repr x and s = Obj.repr y in
      if Obj.is_int r && Obj.is_int s then (Obj.obj r : int) = (Obj.obj s : int) else
      if Obj.is_block r && Obj.is_block s then Obj.tag r = Obj.tag s else
      false
    

    При вызове значений вариантного типа (не полиморфного вариантного типа) эта функция возвращает true, если оба значения имеют один и тот же конструктор с нулевым аргументом или оба имеют один и тот же конструктор с 1 или более аргументами, и false в противном случае. Система типов не помешает вам создать экземпляр equal_constructors для других типов; вы получите возвращаемое значение true или false, но не обязательно осмысленное.

    29.06.2011
  • это несколько уродливый низкоуровневый хак, очень зависящий от деталей реализации компилятора. Приведенное ниже решение является предпочтительным. 01.07.2011
  • @yzzlr Спецификация интерфейса C гарантирует свойства представления, на которые опирается мой код. Так что да, это уродливый низкоуровневый хак, но то, от чего он зависит, является частью задокументированного поведения (единственной) реализации. 01.07.2011

  • 3

    Другой способ сделать это, который может хорошо работать, — это создать другой тип, соответствующий тегам, и использовать этот тип.

    type t = A of int | B of int
    module Tag = struct type t = A | B end
    
    let to_tag = function A _ -> Tag.A | B _ -> Tag.B
    let tags_are_equal x y =
        to_tag x = to_tag y
    
    01.07.2011
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..