Size: a a a

2021 January 07

IK

Ilya Kos in Haskell
Я могу как-то создать type alias на список тайпклассов, которые я deriving?

Я хочу что-то в роде

type APIType = (Eq, Ord, Show, Generic)

Data Foo = Foo deriving APIType
источник

IK

Ilya Kos in Haskell
Но как есть оно не будет работать
источник

AP

Aleksei (astynax) Pi... in Haskell
Для дерайвинга — нельзя
источник

AP

Aleksei (astynax) Pi... in Haskell
Для констреинтов — можно
источник

AP

Aleksei (astynax) Pi... in Haskell
(наверное, можно использовать CPP, но я бы не стал...)
источник

MP

Misha Puzanov in Haskell
а расскажите плиз, что вот в таком коде может пойти не так?

withROTransaction :: ModeBool e
  => Environment e
  -> (Transaction ReadOnly -> IO a)
  -> IO a
withROTransaction e@(Environment env) f =
  bracketOnError
    (mdb_txn_begin env Nothing True)
    mdb_txn_abort
    $ \txn -> do
      a <- f (Transaction txn)
      mdb_txn_commit txn
      return a
первое что приходит в голову — есть небольшой шанс что mdb_txn_abort будет вызвана после/во время mdb_txn_commit

Есть ли какое-то варианты вызывать только что-то одно из них (без нагромождений из флажков в IORef)?
источник

MP

Misha Puzanov in Haskell
контекст проблемы: редкий segfault in liblmdb при очень большом числе транзакций, в которые прилетает AsyncException
источник

MP

Misha Puzanov in Haskell
я подозреваю аборт после коммита, но фиг знает
источник

MP

Misha Puzanov in Haskell
более того, не должен ли код транзакции быть?
\txn -> do 
      !a <- f (Transaction txn)
      mdb_txn_commit txn
      return a
источник

YS

Yan Shkurinskiy in Haskell
Misha Puzanov
более того, не должен ли код транзакции быть?
\txn -> do 
      !a <- f (Transaction txn)
      mdb_txn_commit txn
      return a
т.е. есть подозрение что проблема в том, что значение получается лениво?
источник

MP

Misha Puzanov in Haskell
а вот не знаю кстати
источник

MP

Misha Puzanov in Haskell
код написан @andrewthad, который по идее должен знать, что он пишет и таких простых ошибок не делать
источник

YS

Yan Shkurinskiy in Haskell
Misha Puzanov
а вот не знаю кстати
там же вроде оно такое должно быть только при unsafeInterleaveIO?
источник

YS

Yan Shkurinskiy in Haskell
или я неверно помню? .-.
источник

MP

Misha Puzanov in Haskell
я до сих пор путаюсь в тонкостях
источник

MP

Misha Puzanov in Haskell
думаю что зависит от f
источник

YS

Yan Shkurinskiy in Haskell
я просто по описанию

unsafeInterleaveIO allows an IO computation to be deferred lazily. When passed a value of type IO a, the IO will only be performed when the value of the a is demanded. This is used to implement lazy file reading, see hGetContents.
источник

YS

Yan Shkurinskiy in Haskell
ну да, в зависимости от того, есть ли это в f
источник

MP

Misha Puzanov in Haskell
ага
источник

YS

Yan Shkurinskiy in Haskell
вообще не думаю, что оно должно быть там
источник