
Kirill
29.09.2017
07:45:32

Alexander
29.09.2017
07:45:44
mtl-style это выше что предложили
вот, если есть такая структура данных ты можешь её подменять

Kirill
29.09.2017
07:46:01
Mtl как раз знаю

Google

Yuriy
29.09.2017
07:46:03

Mikhail
29.09.2017
07:46:03

Alexander
29.09.2017
07:46:16
причем такой варинт легко поднимается в mtl style

Kirill
29.09.2017
07:46:42
Это похоже на упрощение идеи с тайпклассами

Alexander
29.09.2017
07:46:50
хуже только тем,что оно ганартировано не заинлайнится

Yuriy
29.09.2017
07:47:00
когда мне надо было в мапе на ключи смотреть, я изоморфировал её в assocs

Kirill
29.09.2017
07:47:08
Точнее на спуск с уровня типов, на уровень данных

Artyom
29.09.2017
07:47:12

Yuriy
29.09.2017
07:47:15
assocs = iso Map.assocs Map.fromList

Mikhail
29.09.2017
07:47:27

Alexander
29.09.2017
07:48:17
делаешь класс class HasDb m where getDb :: m MyDb
class MonadDb m where ...
op1 :: .. -> m ...
default op1 :: HasDb m, MonadIO m => ... -> m ,,,
op1 = getDb >=> liftIO op1
@volhovm ^

Google

Alexander
29.09.2017
07:50:02
добавление в mtl стек будет таким сложным как instance HasDb X where ... ; instance MonadDb X

Mikhail
29.09.2017
07:50:07
Ну мне кажется это не особо стандартный юзкейс
типа, зачем хранить и то и другое
вот то ли дело если ты в рантайме кладешь такую конфигурацию в Reader

Alexander
29.09.2017
07:50:52
что значит то ли дело? так и делаешь

Mikhail
29.09.2017
07:50:54
особенно все усложняется если метод конфигурации это что-то сложнее
типа там
data Conf = Conf { confFoo :: m Kek -> SomeShitT m () }

Alexander
29.09.2017
07:51:31
зачем там m?

Mikhail
29.09.2017
07:51:42
Я как-то пытался пихать ResourceT $ ConduitT $ ... чето такое в конфигурацию
ну захотелось :p
или какой-нибудь экшн иницилизации

Kirill
29.09.2017
07:52:35

Alexander
29.09.2017
07:52:54
в этом подходе клей по IO работает
и делать hoist $ control $ \mmorph -> ...
или ещё что
@saksmt библиотеки resourcet и conduiit смотри

Mikhail
29.09.2017
07:53:44
hoist работает, но это боль страшная как по мне

Alexander
29.09.2017
07:53:59
ну у нас с monad-control норм

Google

Kirill
29.09.2017
07:54:02

Alexander
29.09.2017
07:54:42
в большинстве случаев такие структуры только IO должны знать или если там forall m . Monad m => написать можно

Mikhail
29.09.2017
07:55:02
Вообще мы еще пользуемся параметризуемой базой
типа там
не IO, а что-нибудь другое, что в тестах меняется
поэтому всякие такие конфигурации обрастают дичью

Alexander
29.09.2017
08:00:09
ну я толковых вещей с подменой base monad в тестах особо не видел, не сталкивался не знаю
ха... сотрудники из швейцарии находят первую озвученную цену на f(by) достаточно большой

Quet
29.09.2017
08:05:58
а какая цена? )

Alexander
29.09.2017
08:06:23
там висело что-то вроде 930$ но комментариев от организатором не было, может и ошибка
щас написано скажут позднее

Mikhail
29.09.2017
08:06:40
функция от беларусских рублей? ?

Quet
29.09.2017
08:07:12
930$ за f.by это как-то дохера

Alexander
29.09.2017
08:07:16
Dmitry @meilalina а может уже известен хотя бы порядок
учитывая изменение бел рублей - функция вполне возможно

Mikhail
29.09.2017
08:08:09
Я погуглил — можно было название и более адекватным придумать конечно

Andrei
29.09.2017
08:08:12

Mikhail
29.09.2017
08:08:30
А че, в чем соль конфы? Какие спикеры хорошие есть?

Andrei
29.09.2017
08:08:56
снойман пойдёт?

Mikhail
29.09.2017
08:09:27
Ну так

Google

Mikhail
29.09.2017
08:09:58
Я посмотрел предыдущий год уже, да.

Andrei
29.09.2017
08:10:30
https://twitter.com/ruHaskell/status/910124053624696832 пока только вот так

Alina
29.09.2017
08:14:09
Привет! Да, это ошибка, прошу прощения. Будет цена примерно как и в прошлом году

Aleksey
29.09.2017
08:26:52
Отлично!

Alexander
29.09.2017
08:36:45
@meilalina спасибо!

kana
29.09.2017
12:23:30
Хм, могу предположить, что писать
f x = g (runX x)
зачастую предпочтительнее, чем
f (X x) = g x
Из-за лени (ну и немного для инкапсуляции).
Ранее я часто использовал именно второй вариант, который субъективно проще выглядит, и не понимал, почему так часто используют первый

Aleksey
29.09.2017
12:25:01
почему? Матчинг точно так же не будет производиться. пока кто-то не сфорсит вызов f и g

kana
29.09.2017
12:25:21
То есть разницы нет?

Aleksey
29.09.2017
12:25:22
Ну и компилятору всяко виднее, как такое оптимизировать
Нет
(но это не точно)

Artyom
29.09.2017
12:25:58
если X – это ньютайп, то вроде бы разницы вообще ровно ноль
и лень на ньютайпы не работает

Aleksey
29.09.2017
12:26:00
первый лучше хотя бы тем, что можно написать
f = g . runX :)

Mikhail
29.09.2017
12:26:02

Artyom
29.09.2017
12:27:06
> newtype X a = X {runX :: a}
> let f (X x) = 0
> f undefined
0

Aleksey
29.09.2017
12:27:39
ага, матчинг не форсится, если матчимое не используется нигде

Artyom
29.09.2017
12:27:43
нет
> data Y a = Y {runY :: a}
> let g (Y y) = 0
> g undefined
*** Exception: Prelude.undefined
это конкретно фишка ньютайпов
• для newtype, wrap/unwrap ничего не делают в рантайме (они всего лишь меняют тип в компайл-тайме)
• а для data – делают

Google

Aleksey
29.09.2017
12:28:48
Хмм... ньютахп выродится в f x = 0
λ> data Y a = Y { runY :: a }
λ> let f (Y y) = 0
λ> f (Y undefined)
0

kana
29.09.2017
12:31:16
Как-то это не очень интуитивно. А, нет, таки норм, сматчил, но значение не достал.
А ньютайп попросту и матчить не нужно

Aleksey
29.09.2017
12:31:38
Если знать, во что превращаются ньютайпы, то всё логично
Но это дополнительный контекст, не отраженный в типе. Что напрягает, да

Andrew
29.09.2017
14:28:39

Andrei
29.09.2017
17:06:42
видел ли кто-нибудь из присутствующих http://www.luna-lang.org вживую?

kana
29.09.2017
17:07:28
Полгода назад подписался, новостей и альфы так и не было

Alexander
30.09.2017
06:47:48
Какую prelude юзать? Protolude, base-prelude, classy-prelude или ещё что-то?

Denis
30.09.2017
06:48:32
первую)

Anatolii
30.09.2017
06:49:15
а как же https://github.com/serokell/universum ?:)

Alexander
30.09.2017
08:00:34
universum, на него хоть ругаться тут можно
или base, говорят вполне терпим

Yuriy
30.09.2017
12:07:17
или вообще никакого

Artyom
30.09.2017
12:14:42
если что-то маленькое, то просто base-prelude, если что-то побольше, то Imports.hs, в котором всё, что мне нравится

Aleksey
30.09.2017
12:18:19
Прелюдии, это не только импорты

Artyom
30.09.2017
12:19:53
в абсолютном большинстве это импорты + прятание вредных импортов типа head + какие-нибудь самописные классы