Abbath
27.10.2018
10:07:19
@qnikst когда ты писал deriveAeson, что это значило?
Alexander
27.10.2018
10:07:54
атоматом тот инстанс задерайвить
с правильным отображением
Abbath
27.10.2018
10:08:50
Хмм, а как?
Google
Abbath
27.10.2018
10:09:00
Я чет не силен в этой магии
Alexander
27.10.2018
10:10:33
посмотри модуль Data.Aeson.TH
но можешь и забить и руками написать
Abbath
27.10.2018
10:12:47
Там deriveJSON
Ок, понял
kana
27.10.2018
10:21:05
а есть какие-то статьи, объясняющие, почему ВХ линзы именно такие, какие они? То есть как было придумано добавить функтор? Понятно, как линзы работают, не понятно, как и почему именно так. Единственная правдоподобная интуиция звучит как "при линзе мы просто разбираем объект, а потом снова собираем, то есть она ничего не делает. Чтобы что-то делала, нужно дать возможность ей делать какой-то эффект при сборе и разборе, но так, чтобы эффект выбирался не самой линзой, а тем, кто ее использует". Собственно f - это и есть какой-то эффект, который нужен при разборе и сборе объекта линзой
A64m
27.10.2018
10:34:37
вероятно их просто открыли как существующие уже функции которые работают как линзы
http://conal.net/blog/posts/semantic-editor-combinators
а потом обобщили
Abbath
27.10.2018
10:44:04
@qnikst что должна функция run возвращать?
Alexander
27.10.2018
10:44:39
Value
Ilya
27.10.2018
10:57:02
а есть какие-то статьи, объясняющие, почему ВХ линзы именно такие, какие они? То есть как было придумано добавить функтор? Понятно, как линзы работают, не понятно, как и почему именно так. Единственная правдоподобная интуиция звучит как "при линзе мы просто разбираем объект, а потом снова собираем, то есть она ничего не делает. Чтобы что-то делала, нужно дать возможность ей делать какой-то эффект при сборе и разборе, но так, чтобы эффект выбирался не самой линзой, а тем, кто ее использует". Собственно f - это и есть какой-то эффект, который нужен при разборе и сборе объекта линзой
https://bartoszmilewski.com/2013/10/08/lenses-stores-and-yoneda/
но я не уверен, что ВЛ прям Йонеду применял, а не догадался
Abbath
27.10.2018
11:12:58
Alexander
27.10.2018
11:14:06
пользовательская функция возвращает что угодно что ToJSON
Google
Alexander
27.10.2018
11:14:12
а run - Value
Abbath
27.10.2018
11:18:22
Alexander
27.10.2018
11:18:42
data Task = Task | Whatever
Abbath
27.10.2018
11:18:49
Хмм
Alexander
27.10.2018
11:19:10
если скажешь как они выглядят скажу как парсер сделать
но в целом как вчера писали про <|>
fromJSON = asum [ parseTask | parseWhateevr
Abbath
27.10.2018
11:21:16
Там есть еще вариант {"check" : 1234 }
Alexander
27.10.2018
11:26:53
делаешь:
data Request = Task .. | Check Int
если руками парсер то:
instance FromJSON Request where
fromJSON x = asum [parseCheck, parseTask]
where
parseCheck = withObject "check" $ \o -> Check <$> (o .: "check")
parseTask = ...
что-то такое
Abbath
27.10.2018
11:29:04
А сгенерить не выйдет?
A64m
27.10.2018
11:29:12
сейчас решил посмотреть первый доклад кметта по линзам, он там говорит "апи text какой-то не хаскельный, повторяются все прелюдийные функции для списков, импортировать надо квалифицированно и т.д."
смеяться или плакать? не знаю
Alexander
27.10.2018
11:31:33
выйдет, но не факт что тебе шлют подходящий json
Abbath
27.10.2018
11:35:31
Alexander
27.10.2018
11:41:06
смотри ситуация такая
все зависит от того, что там бегает, посмотри документацию в Data.Aeson.TH
по поводу того сможешь ли подобрать опции генерации чтобы сделать тот json который от тебя ожидают
вариант сделать руками работает вообще всегда
остальные не факт
Google
Alexander
27.10.2018
11:42:30
и для парсера и для принтера
Abbath
27.10.2018
11:50:23
‘fromJSON’ is not a (visible) method of class ‘FromJSON’
kana
27.10.2018
11:57:23
parseJSON
Abbath
27.10.2018
11:59:38
• No instance for (GHC.Base.Alternative ((->) Value))
arising from a use of ‘asum’
Alexander
27.10.2018
12:05:49
я писал прямо в чат
не проверяя в ghci
Abbath
27.10.2018
12:06:04
Ок, нашел как сделать
Alexander
27.10.2018
12:06:11
asum [parseCheck x, parseTask x]
например
Abbath
27.10.2018
12:28:03
Чем сворачивают список Maybe?
Чтобы сразу Just или Nothing если есть
sequence?
kana
27.10.2018
12:31:03
Да
Aleksey
27.10.2018
14:07:41
Вот у меня есть Maybe a и a -> IO (Maybe b). И мне нужно получить IO (Maybe b)
join <$> sequence (f <$> x)
Это работает, но м.б. есть решение по-проще?
Alexander
27.10.2018
14:08:56
traverse f x ?
Aleksey
27.10.2018
14:09:44
IO (Maybe (Maybe b)) будет
Pineapple
27.10.2018
14:09:53
join <$> traverse f a
Aleksey
27.10.2018
14:10:22
Ну да, я пробовал. Всё равно join остаётся, но так короче, конечно
Google
kana
27.10.2018
14:10:30
f :: (a -> IO (Maybe b)) -> Maybe a -> IO (Maybe b)
f g = maybe (pure Nothing) g
иногда лучше сделать просто матчинг
Pineapple
27.10.2018
14:11:04
А куда от джойна деться? Кто-то же должен истребить вложенный мейди
kana
27.10.2018
14:11:34
выше валидный проверенный код, никакого join
Aleksey
27.10.2018
14:11:44
Но в целом maybe тоже ок, да
kana
27.10.2018
14:12:36
зачем, это же намного лучше кучуи join/traverse/sequence
просто кейс
Aleksey
27.10.2018
14:13:17
traverse/sequence, это норм. Вот join вместа с ними, это уже сложновато для прочтения
kana
27.10.2018
14:13:43
f :: (a -> IO (Maybe b)) -> Maybe a -> IO (Maybe b)
f g = foldM (const g) Nothing
но это хуже maybe тоже конечно
вот еще решение
ого, взгляд на arrow как на линзы конечно чет слишком крутой
Imants
27.10.2018
14:24:06
А что нужно упростить-то: описание этой ф или содержание?
Можно ж сделать утилитку с простым описанием, и какая разница, что у неё внутри?
Alexander
27.10.2018
14:28:52
arrow syntax жн
Dmitry
27.10.2018
14:39:38
Чтобы x &*& f и всё
kana
27.10.2018
14:40:28
хотя это настолько очевидно конечно
Alexander
27.10.2018
14:43:37
эта |> функция же в Data.Function как & определена
Google
kana
27.10.2018
14:44:35
да я знаю, проще написать определение чем импортировать
ну и еще было не слишком очевидно, что Arrow.first и Bifunctor.first (а в коде выше взаимозамеяемы вообще)
не ну если заменить на Bifunctor, то все резко становится слишком очевидно и довно известно
∀
27.10.2018
16:05:14
Есть ли naming convention для тайпсинонимов, скрывающих типовый параметр?
Например, у меня есть некое Foo a и type Bar = Foo Baz
Как лучше переназвать Foo: Bar', Bar_, etc. ?
Вообще какие существуют naming conventions, помимо тех, которые в https://wiki.haskell.org/Programming_guidelines#Naming_Conventions?
Придумывание имён занимает слишком много времени...
Terminator
27.10.2018
16:07:44
Daniel Kogan будет жить. Поприветствуем!
David
27.10.2018
17:57:02
Что-то вроде опроса. А Cloud Haskell кто-нибудь использует в продакшине? Пакет distributed-process и все остальные. Или все ушли на REST?
Alexander
27.10.2018
17:59:02
я знаю большую фирму, которая использует
ещё adjoint используют
где Diehl
но подробностей не знаю
вообще CH так себе далеко не всегда нужно
Artyom
27.10.2018
18:00:51
Kirill
27.10.2018
18:02:19
неплохо, избегает успеха на 5+
Alexander
27.10.2018
18:04:36
у кубернетеса же типы раскидистые тоже?