Как работать с автоматически сгенерированными значениями в строго типизированных языках при определении общего CRUD? - PullRequest
0 голосов
/ 09 октября 2019

Итак, я представляю, что универсальный CRUD имеет все основные операции для некоторого типа. Вставка, чтение, удаление и т. Д. Но как мне определить операцию «вставки» для такого универсального типа, если внутренняя переменная будет генерировать некоторые значения?

trait GenericCrud[E]{
    def insert(value:E): Unit // but in the insert I really don't want to provide a value E, but some incomplete version of it.
}

1 Ответ

3 голосов
/ 09 октября 2019
  1. Обычно вы можете использовать класс типов без тегов, где

    class (MonadIO mio) => Crud a mio where
      read :: ? -> mio a
    

    Лично мне это не нравится

  2. Но ярекомендую использовать Free Monad, чтобы

    data Crud c a where
      Read :: c -> Crud c a
      Insert :: c -> a -> Crud c a
      Create :: a -> Crud c a
      Delete :: c -> Crud c a
      deriving Functor
    

    Затем перехватить алгебру до IO.

...