Haskell: Перекрывающиеся экземпляры

Вот три разновидности:

  1. числовой . Простое увеличение числового значения, например 1,2,3, ....
  2. Идентификатор GUID . глобально универсальный идентификатор, как тип данных RAW.
  3. GUID (строка) . То же, что и выше, но в виде строки, которая может быть проще в некоторых языках.

x - столбец идентификаторов. Замените FOO своим именем таблицы в каждом из примеров.

-- numerical identity, e.g. 1,2,3...
create table FOO (
    x number primary key
);
create sequence  FOO_seq;

create or replace trigger FOO_trg
before insert on FOO
for each row
begin
  select FOO_seq.nextval into :new.x from dual;
end;
/

-- GUID identity, e.g. 7CFF0C304187716EE040488AA1F9749A
-- use the commented out lines if you prefer RAW over VARCHAR2.
create table FOO (
    x varchar(32) primary key        -- string version
    -- x raw(32) primary key         -- raw version
);

create or replace trigger FOO_trg
before insert on FOO
for each row
begin
  select cast(sys_guid() as varchar2(32)) into :new.x from dual;  -- string version
  -- select sys_guid() into :new.x from dual;                     -- raw version
end;
/

обновление:

Oracle 12c представляет следующие два варианта, которые не зависят от триггеров:

create table mytable(id number default mysequence.nextval);
create table mytable(id number generated as identity);

Первый использует последовательность традиционным способом; второй управляет значением внутри.

9
задан yairchu 30 June 2009 в 15:10
поделиться

2 ответа

В продолжение отличного ответа ephemient: классы типов Haskell используют предположение открытого мира : какой-нибудь идиот может прийти позже и добавить объявление экземпляра, которое не является дублировать , но перекрывает ваш экземпляр. Думайте об этом как об игре с противником : если злоумышленник может сделать вашу программу неоднозначной, компилятор блеет.

Если вы используете GHC, вы, конечно, можете сказать компилятору: «К черту вашу паранойю. ; позвольте мне мое неоднозначное объявление экземпляра ":

{-# LANGUAGE OverlappingInstances #-}

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

35
ответ дан 4 December 2019 в 06:11
поделиться

Тот факт, что вы не определили экземпляр в своем текущем модуле, не означает, что он не может быть определен где-то еще.

{-# LANGUAGE ... #-}
module SomeOtherModule where

-- no practical implementation, but the instance could still be declared
instance SuperMonad (StateT s m) m

Предположим, ваш модуль и SomeOtherModule связаны в одну программу.

Теперь ответьте на этот вопрос: использует ли ваш код

instance SuperMonad a a
  -- with a = StateT Int IO

или

instance (SuperMonad a b, MonadTrans t, Monad b) => SuperMonad a (t b)
  -- with a = StateT Int IO
  --      t = StateT Int
  --      b = IO

?

8
ответ дан 4 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: