Я играю со свободными монадами в Haskell, и я застрял с определением функций, которые поднимают конструкторы функторов в монаде Free.
У меня есть функтор AppF как сумма нескольких функторов, каждый из которых представляет эффект. Одним из таких функторов является DbTrF, представляющий эффекты транзакций db.
Итак, мой AppF определяется следующим образом:
data AppF a =
DbTr (DbTrF a)
| ... functors for the other types of effects
deriving (Functor)
мой DbTrF определяется следующим образом:
data Op i r =
Get i
| Insert i r
| Delete i
| Update i (r -> r)
data DbTrF a =
UserTb (Op UserId UserData) (Maybe UserData -> a)
| SessionTb (Op SessionId SessionData) (Maybe SessionData -> a)
| ... here is the code for other tables
deriving(Functor)
тогда я хотел бы иметь функцию transact
transact :: Table i r t-> Op i r -> AppM (Maybe r)
... который я хотел бы использовать следующим образом:
transactExample = transact UserTb (Get someUserId)
Для этого я хочу представить тип Table как функцию, которая выполняет операцию и возвращает значение DbTrF:
newtype Table i r a = Table {tbId :: Op i r -> (Maybe r -> a) -> DbTrF a}
Моя попытка будет примерно такой:
transact (Table tb) op = liftF (DbTr (tb op ???))
но я не уверен, что поставить вместо вопросительных знаков.
Это хорошее направление для подражания или я делаю это неправильно?
Спасибо!
transactExample = transact (Table UserTb) (Get someUserId)
- person Michael   schedule 31.03.2017