Dmitry
но даже если и можно там никто ничего не понимает
Alexander
На реддит?
Dmitry
а там вообще можно вопросы задавать? или только набросы и статьи
Alexander
Кто-то задает периодически, я его почти не читаю
Dmitry
в целом-то да, мне кажется что надо типизировать ключи. суть в том, что в CAS хранилище есть два типа объектов - непосредственно объекты , ключом которых является хэш их бинарного представления, и индексируемые объекты - т.е хранимый объект может поменяться, но индекс будет неизменен. Т.е довольно просто сделать два вида ключей в домене и мапить их через тайп фемилис
Dmitry
но. получается, что домену теперь есть дело до того, где и как он хранится
Alexander
Если есть возможность в гисте написать список того что и где лежать может, то можно решение вывести
Alexander
Тип ключа наверное можно по типу значения вывести, т.е. как оно там хранится
Alexander
Через TF
Alexander
Тут большой вопрос может ли в базе лежать reference на неизвестный статично тип
Dmitry
ну, я считаю что в тех местах, где подхватываю что-то из базы, тип мне известен
Alexander
Тогда на GADT все должно красиво писаться
Dmitry
смущает меня собственно два вида ссылок (непосредственные и индексные) и то, что домен - который вроде как чистые данные - должен это как-то принимать во внимание
Dmitry
т.е смешение уровней абстракции неким образом.
Dmitry
пойду что ли наброшу в гиттере про другое. или рано еще
Alexander
Есть еще вариант: сделать newtype Referenced
Dmitry
а как это поможет?
Alexander
И щас если с телефона не убьюсь писать:
Alexander
class GetValue a where type Key a : * get :: Key a -> DB -> (Maybe a) default get :: Hashable a, Key a~ a) => a -> db -> Maybe a get x = getFromDb (hash x) Instance G Referenced a where KEY (Referenced a) = K a -- Int ...
Alexander
Тогда для всех value типов просто пишешь instance G Foo where Key Foo = Foo
Alexander
Но придется платить тем, что у тебя Referenced X будет в адт, что криво
Alexander
Можно сделать значения как в виниле, в функтор запрятанные и передавать туда или Identity (полная загрузка объекта) или Maybe (загрузка с возможностью ошибки) или Referenced (неглубокая загрузка) или Either Referenced (смысл по желанию)
Alexander
Т.е. Dbbvalue f = Foo (f Another Value) Bar
Alexander
Но это на границе пушки и воробьев
Dmitry
что-то да.
Dmitry
хочется сами типы иметь как можно более простыми, а метаинформацию держать где-то еще
Alexander
Ну вон класс типов вышк
Alexander
Подойдет?
Alexander
Единственоое что в базу придется класть значение, которое referenced где ссылки, если это допустимо
Alexander
Если не допустимо и тип всегда или value или referenced то есть еще варианты
Dmitry
ну выглядит похоже на то, что мне нужно. все равно напрягает что домен, которум в принципе должно бытб пофиг, как он хранится, придется отличать value от reference
Dmitry
но если я это сам себе смогу обосновать, то да - можно сделать разные типы для разных ссылок и через тайпфемили мапить их на разные типы ключей в БД
Alexander
Можно и по другому но с бойлерплейтом
Dmitry
там у тебя тип DB прибит, а еще надо понимать, что это наверное IO
Dmitry
и даже не IO, а MonadIO
Dmitry
и тайпкласс получается довольно развесистый...
Alexander
Нафиг monadIO пользователь лифтнет куда надо
Dmitry
т.е просто Monad ?
Alexander
С дб, да не удобно
Alexander
Ну то что база просит минимально
Dmitry
IO ?
Alexander
Наверное
Alexander
Хм.. без IO тоже наверное можно
Alexander
Класс может отдавать функции генерации ключа и сериализаторы
Alexander
А вызывать его из другой функции которая уже в IO
Dmitry
ну у меня сложнее, у меня ключ становится известен после сохранения объекта, так что нет.
Dmitry
для "непосредственного" объекта
Alexander
А т.е. хэш средствами базы?
Alexander
Ладно, наверное я всех требований подожду прежде чем угадывать интерфейс
Dmitry
ну вопрос даже не в конкретном интерфейсе
Dmitry
а в том, как абстрагировать данные домена от того, как они хранятся
Dmitry
наверное, действительно лучшее, что можно сделать - это ввести разные типы ключей для разных сущностей и мапинг через семейства типов, это ок
Dmitry
а ведь наверное еще можно через Data или Generic каким-то образом преобразовывать ADT к типу, когда все значения заменяются на ключи или наоборот
Dmitry
знатокам английского. если поднять объект из базы по ссылке - будет summon , то как будет упихать объект в базу?
Dmitry
всякие put/set load/save ???/store уже заняты и слишком скучно
Vladimir
banish
Vladimir
:D
Anonymous
всегда знал что кодинг на хаскеле - магия вот и сейчас объекты не забирают из базы, а призывают
Vladimir
confine
Vladimir
?
Dmitry
я так еще с перла пишу
Dmitry
уже тогда put/get load/save было плотно занято всеми
Dmitry
по многу раз
Vladimir
О!
Vladimir
dismiss
Vladimir
хороший вариант
Dmitry
надо решить confine или dismiss - и то и то подходит, но смысл несколько отличается
Vladimir
обожаю такие вещи
Vladimir
ЖВ
Dmitry
confine вообще нормально по моему
Dmitry
по крайней мере логично.
Anatolii
banish?
Dmitry
blobster - тюрьма объектов, чо уж.
Vladimir
да, dismiss - это типа в пустоту отправить, а confine - в какое-то конкретное место
Vladimir
если у нас тюрьма, то можно incarcerate
Vladimir
:D
Dmitry
1) призвать ктулху -> ??? ктулху
Anatolii
изгонять?
Dmitry
изгонять это когда способ удаления объектов появится
Dmitry
пока они никуда не деваются