
Dmitry
28.02.2017
06:36:57
@qnikst вы ж стафф храните в KV ?

Alexander
28.02.2017
06:40:44
Да

Dmitry
28.02.2017
06:41:04
и что если надо ссылаться?

Alexander
28.02.2017
06:41:30
Но у нас туда граф кладется и как-то тупо, т.е. то, что это KV не видно

Google

Dmitry
28.02.2017
06:41:51
т.е одним чанком кладется, одним поднимается?

Alexander
28.02.2017
06:41:57
Примерно
Там диффы стейта кладутся
И снапшоты
В другом месте (другой проект) тоже тупо, но там можно лучше
Там по типу ключа можно понять тип значения и то reference это или значение, может ли их много храниться и т.п.

Dmitry
28.02.2017
06:43:28
да у меня тоже всё тупо, но я заметил, что апдейт большого чанка и его запись как-то много времени занимают, и попилил на куски
а куски должны друг на друга ссылаться

Alexander
28.02.2017
06:43:39
Соотв все ключи можно представить GADT-тос
*том

Dmitry
28.02.2017
06:44:02
о. типизированные ключи
а нету ли какой-то иллюстрации?
как это правильно делается?

Google

Alexander
28.02.2017
06:45:17
Нету, я еще не запилил, но скоро набросать смогу, мне щас надо ехать отца из больницы в больницу везти

Dmitry
28.02.2017
06:48:40
не могу понять, где устроить специальную олимпиаду по этому вопросу

Alexander
28.02.2017
06:49:33
data Key * where
Key1 :: .. -> Key 'Reference (Key Foo)
Key2 :: .. -> Key 'Value Foo
Везде :)
На гист положить можно, и рассказать тут и в гиттере, дальше разнесут

Dmitry
28.02.2017
06:50:18
в гиттере народ что-то недружелюбный, а здесь его мало :)

Alexander
28.02.2017
06:50:22
То что выше если по ключу известно значение там или референс

Dmitry
28.02.2017
06:50:27
а на стековерфлоу наверное вопросы дизайна нельзя
но даже если и можно там никто ничего не понимает

Alexander
28.02.2017
06:51:22
На реддит?

Dmitry
28.02.2017
06:51:41
а там вообще можно вопросы задавать? или только набросы и статьи

Alexander
28.02.2017
06:52:03
Кто-то задает периодически, я его почти не читаю

Dmitry
28.02.2017
06:53:36
в целом-то да, мне кажется что надо типизировать ключи. суть в том, что в CAS хранилище есть два типа объектов - непосредственно объекты , ключом которых является хэш их бинарного представления, и индексируемые объекты - т.е хранимый объект может поменяться, но индекс будет неизменен. Т.е довольно просто сделать два вида ключей в домене и мапить их через тайп фемилис
но. получается, что домену теперь есть дело до того, где и как он хранится

Alexander
28.02.2017
06:57:00
Если есть возможность в гисте написать список того что и где лежать может, то можно решение вывести
Тип ключа наверное можно по типу значения вывести, т.е. как оно там хранится
Через TF
Тут большой вопрос может ли в базе лежать reference на неизвестный статично тип

Dmitry
28.02.2017
07:02:54
ну, я считаю что в тех местах, где подхватываю что-то из базы, тип мне известен

Alexander
28.02.2017
07:03:21
Тогда на GADT все должно красиво писаться

Google

Dmitry
28.02.2017
07:03:44
смущает меня собственно два вида ссылок (непосредственные и индексные) и то, что домен - который вроде как чистые данные - должен это как-то принимать во внимание
т.е смешение уровней абстракции неким образом.
пойду что ли наброшу в гиттере про другое. или рано еще

Alexander
28.02.2017
07:05:47
Есть еще вариант: сделать newtype Referenced

Dmitry
28.02.2017
07:05:56
а как это поможет?

Alexander
28.02.2017
07:06:02
И щас если с телефона не убьюсь писать:
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
...
Тогда для всех value типов просто пишешь instance G Foo where Key Foo = Foo
Но придется платить тем, что у тебя Referenced X будет в адт, что криво
Можно сделать значения как в виниле, в функтор запрятанные и передавать туда или Identity (полная загрузка объекта) или Maybe (загрузка с возможностью ошибки) или Referenced (неглубокая загрузка) или Either Referenced (смысл по желанию)
Т.е. Dbbvalue f = Foo (f Another Value) Bar
Но это на границе пушки и воробьев

Dmitry
28.02.2017
07:14:11
что-то да.
хочется сами типы иметь как можно более простыми, а метаинформацию держать где-то еще

Alexander
28.02.2017
07:18:12
Ну вон класс типов вышк
Подойдет?
Единственоое что в базу придется класть значение, которое referenced где ссылки, если это допустимо
Если не допустимо и тип всегда или value или referenced то есть еще варианты

Dmitry
28.02.2017
07:19:33
ну выглядит похоже на то, что мне нужно. все равно напрягает что домен, которум в принципе должно бытб пофиг, как он хранится, придется отличать value от reference
но если я это сам себе смогу обосновать, то да - можно сделать разные типы для разных ссылок и через тайпфемили мапить их на разные типы ключей в БД

Google

Alexander
28.02.2017
07:20:49
Можно и по другому но с бойлерплейтом

Dmitry
28.02.2017
07:21:59
там у тебя тип DB прибит, а еще надо понимать, что это наверное IO
и даже не IO, а MonadIO
и тайпкласс получается довольно развесистый...

Alexander
28.02.2017
07:22:58
Нафиг monadIO пользователь лифтнет куда надо

Dmitry
28.02.2017
07:23:20
т.е просто
Monad
?

Alexander
28.02.2017
07:23:23
С дб, да не удобно
Ну то что база просит минимально

Dmitry
28.02.2017
07:23:42
IO ?

Alexander
28.02.2017
07:23:47
Наверное
Хм.. без IO тоже наверное можно
Класс может отдавать функции генерации ключа и сериализаторы
А вызывать его из другой функции которая уже в IO

Dmitry
28.02.2017
07:25:05
ну у меня сложнее, у меня ключ становится известен после сохранения объекта, так что нет.
для "непосредственного" объекта

Alexander
28.02.2017
07:26:25
А т.е. хэш средствами базы?
Ладно, наверное я всех требований подожду прежде чем угадывать интерфейс

Dmitry
28.02.2017
07:27:54
ну вопрос даже не в конкретном интерфейсе
а в том, как абстрагировать данные домена от того, как они хранятся
наверное, действительно лучшее, что можно сделать - это ввести разные типы ключей для разных сущностей и мапинг через семейства типов, это ок

Google

Dmitry
28.02.2017
07:55:28
а ведь наверное еще можно через
Data
или
Generic
каким-то образом преобразовывать ADT к типу, когда все значения заменяются на ключи или наоборот
знатокам английского. если поднять объект из базы по ссылке - будет
summon
, то как будет упихать объект в базу?
всякие put/set load/save ???/store уже заняты и слишком скучно

Vladimir
28.02.2017
09:08:54
banish
:D

Vladimir
28.02.2017
09:09:06
всегда знал что кодинг на хаскеле - магия
вот и сейчас объекты не забирают из базы, а призывают

Vladimir
28.02.2017
09:09:41
confine
?

Dmitry
28.02.2017
09:09:48
я так еще с перла пишу
уже тогда put/get load/save было плотно занято всеми
по многу раз

Vladimir
28.02.2017
09:10:21
О!
dismiss
хороший вариант

Dmitry
28.02.2017
09:10:45
надо решить confine или dismiss - и то и то подходит, но смысл несколько отличается

Vladimir
28.02.2017
09:10:47
обожаю такие вещи
ЖВ

Dmitry
28.02.2017
09:10:49
confine вообще нормально по моему
по крайней мере логично.

Anatolii
28.02.2017
09:10:56
banish?

Dmitry
28.02.2017
09:11:05
blobster - тюрьма объектов, чо уж.

Vladimir
28.02.2017
09:11:21
да, dismiss - это типа в пустоту отправить, а confine - в какое-то конкретное место