Anonymous
не знаю, ничего про персистент. Но имя сгенеренного типа-то у вас есть?
Вот тут уже начинается область, где я буду плавать в терминологии. Из этого описания генерируется GADT, а я толком не понимаю что это такое.
λ> :t UserAvatar
UserAvatar :: EntityField User (Maybe Text)
λ> :i UserAvatar
data instance EntityField User typ where
...
UserAvatar :: typ ~ Maybe Text => EntityField User typ
...
Мне нужно поведение show UserAvatar == "UserAvatar"
UserAvatar является конструктором для типа EntityField User (Maybe Text) .
Сгенеренный тип тут - User. Он мне не нужен для того чтобы сделать нужный мне show. TH генерирует конструктор на каждое поле, причем каждое поле будет иметь свой EntityField a b. Если как то возможно задерайвить Show для EntityField a b где a и b заранее неизвестны то это хорошо.
Anonymous
Почему a->a не правильно?
Если сделать класс с ф not', а под него свой случай / instance для B, то и
a -> a
сойдёт.
Это если в планах плодить и другие Б
Dmitry
а чем OVERLAPPING тут мешает? Если комиляцию проходит, то и норм, наверное? Что будет в том коде, который приведен, неизвестно. Зависит от того из какой монады m вызывается. Надо полный пример, мне кажется.
кана
кана
с Overlapping (как в дефолте) при наличи в стеке IO currentTime будет зависить от IO
без Overlapping при наличии в стеке IO currentTime будет брать из ReaderT
кана
независимо от того, какой тип
Dmitry
Dmitry
а тип индексирован типом записи таблицы и типом поля
Dmitry
наворочено... Мне кажется, что сейчас можно делать по-другому. Но это все 8 лет назад делалось
Dmitry
Dmitry
sorry, продолжу
Dmitry
ghci> x <- getCurrentTime
ghci> let f1=currentTime >>= liftIO . print >> currentTime >>= liftIO . print :: ReaderT UTCTime IO ()
ghci> let f2=currentTime >>= liftIO . print >> currentTime >>= liftIO . print :: IO ()
ghci> runReaderT f1 x
2018-05-01 17:53:54.648298031 UTC
2018-05-01 17:53:54.648298031 UTC
ghci> f2
2018-05-01 17:55:28.411178197 UTC
2018-05-01 17:55:28.412000884 UTC
Dmitry
на мой взгляд все работает со всеми overlapping'ами
кана
Aleksey
Alexander
?
кана
кана
currentTime без liftIO же нужен
Алексей ayaye :)
привет. на нубские вопросы отвечаете? )
Антон
Andrei
да, но в https://t.me/haskell_learn ещё и подробно :)
кана
кекб
Алексей ayaye :)
пасиб
Alexander
ЗДЕСЬ
Alexander
вопросы
Alexander
не, там же о другом разговор
Alexander
есть MonadTime для моканья функции
кана
Alexander
и вопрос был когда она будет работать в IO а когда использовать ReaderT UTCTime
Alexander
т.е. lifted / unlift и прочие не решают этот вопрос
Alexander
и вопросов с Overloading и порядком там тоже не возникает
кана
даже не так, скорее про то, как заюзать ридерный инстанс, если в стеке есть IO
кана
почему-то одинаковый код у меня и выше работает по разному
Alexander
ну там ответ простой только newtype
кана
не только newtype
кана
еще работает орфан инстанс без overlapping
Aleksey
я бы сделал newtype у которого свой особый инстанс
Alexander
нормальный вариант - только 1
Aleksey
а у остальных через MonadBase IO m
Alexander
orphan instance это прям призыв к тому чтобы ghc ногу отстрелил
Alexander
в случае overlapping instances
кана
ну собственно решение с ньютайпом давно есть
кана
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Control.Concurrent
import Control.Monad.IO.Class
import Control.Monad.Reader
import Control.Monad.Time
import Data.Time
newtype MyReaderT e m a = MyReaderT
{ unMyReaderT :: ReaderT e m a
} deriving
( Functor
, Applicative
, Monad
, MonadReader e
, MonadIO
)
instance Monad m => MonadTime (MyReaderT UTCTime m) where
currentTime = ask
runMyReaderT :: MyReaderT e m a -> e -> m a
runMyReaderT m = runReaderT (unMyReaderT m)
program :: (MonadTime m, MonadIO m) => m ()
program = do
liftIO . putStrLn . show =<< currentTime
liftIO $ threadDelay 200000
liftIO . putStrLn . show =<< currentTime
liftIO $ threadDelay 200000
liftIO . putStrLn . show =<< currentTime
main :: IO ()
main = runMyReaderT program =<< currentTime
кана
но у него свои проблемы имхо
Alexander
почему по разному работает - у вас библиотеки одной версии?
Aleksey
можно еще сделать
data CurrentTime = CurrentTime (IO UTCTime)
и MonadReader CurrentTime m
Alexander
вот любители над mtl поиздеваться
Aleksey
в тестах подсовывать один CurrentTime а в проде другой
Alexander
newtype AppBase = AppBase { ....} <- весь нужный стек
Alexander
instance MonadTime AppBase ...
Aleksey
это уже йесод
Alexander
переименуй имя и будет не йесод
Aleksey
подход тот же, подход йесода работает хреново
Aleksey
полиморфный код не попишешь
Alexander
mtl это для одна конкретная монадка, и для неё инстансы напилить, а не магический lift и толпа стеков
Alexander
с AppBase? попишешь конечно
Alexander
т.к. у тебя функции над mtl классами
Aleksey
ну или так, но констрейнты накладывать не на монаду, а на appBase
Aleksey
ну т.е. если тебе нужен код, который не знает про устройство конкретного AppBase
Alexander
ты тупишь
Alexander
смотри у нас есть библиотека, использующая mtl-классы
Alexander
которая ничего не знает про AppBase
Alexander
когда ты делаешь AppBase ты делаешь конкретную вещь, и реализуешь инстансы для этих mtl -классов
Alexander
и все работает
Alexander
а не эти MyReaderT
Aleksey
Alexander
забей
Alexander
просто думай об этом, пусть это будет твоим кошмаром
Aleksey
обязательно
Антон
Хаскельное сообщество меня продолжает умилять своей вежливостью и отзывчивостью
Alex
Антон
Alexander
Антон я вроде segfault-а давно знаю и он меня тоже, можно позволить мне так общаться, если он с чем-то не согласен он скажет
Alex
РХБЗ?
Ну, без Л-1.
Костюм радиохимбиозащиты
Alexander
РХБЗ?
а вот отношении тех, кто рекламирует haskell-learn и не объясняет подробно в этом канале у меня вообще zero-tolerance
Alexander
только очень плохие люди так делают
Alexander
может и в правду ну это все нахрен, пусть будет только haskell-learn и нетоксичные правильные люди, а тут только будет про политоту, и репосты про то, какое общество токсичное и плохое
Alexander
\o/