@haskellru

Страница 1528 из 1551
Maxim
18.10.2018
12:11:31
спасибо

Alexander
18.10.2018
12:35:29
не, не знаю даже как с текущими лейблами это сделать

там же генерится fromLabel @ label :: alpha

у тебя alpha из контекста не выводится, и из @label тоже не выводится

Google
Yuriy
18.10.2018
12:39:13
[pr|label|] — красиво? (пакет tagged)

A64m
18.10.2018
12:43:12
хуже чем @"label"

Alexander
18.10.2018
12:46:02
там конечно @["label"] т.к. список, но все равно

мне старая конвертация с proxy# больше нравилась

Maxim
18.10.2018
14:07:29
@qnikst еще маленький вопросик. я сделал в классе метод foo :: forall v vs. KnownSymbol v, In v vs => r vs -> r vs (r -- тип по которому класс), но вызвать его в духе foo @"bar" не выходит а вот если сделать foo :: forall v vs. KnownSymbol v, In v vs => Proxy v -> r vs -> r vs, то получается вызвать foo (Proxy @"bar") констрейнт In просто проверяет, что тип есть в списке

Alexander
18.10.2018
14:08:48
важно, что внутри

Maxim
18.10.2018
14:08:54
<interactive>:1:10: error: • Expected kind ‘[ghc-prim-0.5.1.1:GHC.Types.Symbol] -> * -> *’, but ‘"bar"’ has kind ‘ghc-prim-0.5.1.1:GHC.Types.Symbol’ • In the type ‘"bar"’ In the expression: foo @"bar"

внутри чего?

Alexander
18.10.2018
14:09:03
если ты внутри тела используешь v то не вижу, что не так

функции

Maxim
18.10.2018
14:09:38
ладно, если я к этой штуке еще вернусь, спрошу подробнее

Alexander
18.10.2018
14:09:41
не ожидаю такую ошибку в первом случае

Terminator
18.10.2018
14:47:23
@droptheplot будет жить. Поприветствуем!

Google
Maxim
18.10.2018
16:10:03
А где можно нормально почитать про final и initial? Я так и не понял чем принципиально отличаются гадты и тайпклассы в final tagless Особенно на всяких expr

Типа в одном случае с большой буквы, в другом с маленькой. И что с того?

A64m
18.10.2018
16:11:32
http://okmij.org/ftp/tagless-final/course/lecture.pdf

Maxim
18.10.2018
16:13:03
А почему initial и final то?

A64m
18.10.2018
16:13:18
так что тогда уж с дататайпс а ля карт сравнивать

прямо в начала пдф-а написано

где-то на первой-второй странице

Maxim
18.10.2018
16:20:45
Спасибо

Гугл почему-то выдаёт на сайте Олега какую-то страничку, где вообще непонятно куда смотреть - просто список статей

Alexander
18.10.2018
16:23:34
это его сайт такой

Denis
18.10.2018
16:24:00
А где можно нормально почитать про final и initial? Я так и не понял чем принципиально отличаются гадты и тайпклассы в final tagless Особенно на всяких expr
есть такая проблема, которую описал Вадлер 2D проблема (3D это когда еще эффекты) в общем в ооп можно легко добавить новый конструктор, но трудно новый метод в фп наоборот файнал таглесс решает эту проблему (вот как пример mtl)

@maksbotan как вариант я сделал небольшой реп с разными подходами https://github.com/xgrommx/purescript-from-adt-to-eadt

правда на пурсе

в хаскель еще можно всякие gadts, type families, data families

Denis
18.10.2018
16:33:44
Спасибо, и это посмотрю)
есть еще несколько подходов (я позже добавлю)

Denis
18.10.2018
17:44:08
Google
Julian
18.10.2018
17:44:09
Википедия говорит, что это так

Denis
18.10.2018
17:44:39
Не знал, что экспрешн проблем - это термин от Вадлера
http://homepages.inf.ed.ac.uk/wadler/papers/expression/expression.txt

Julian
18.10.2018
17:45:11
Верю!

Oleg
18.10.2018
18:04:16
Denis
18.10.2018
18:04:37
открыл, нашёл окамл с фигурными скобками закрыл
то ризон) и я сам не в восторге от него

Maxim
18.10.2018
18:06:37
еще уместно спросить, насколько часто expression problem встречатеся где-то, кроме игрушечных примеров

и так ли успешно подходы, хорошо работающие для нее, обобщаются на другие задачи

Denis
18.10.2018
18:07:33
еще уместно спросить, насколько часто expression problem встречатеся где-то, кроме игрушечных примеров
например пишешь ты язык и хочешь чтобы он был расширяем, применять такие инструкции как дешугаринг а ля карте и много другого

вот mtl же применяет идею final tagless

Oleg
18.10.2018
18:11:16
Во всяких кровавых ентерпрайзах регулярно такая беда с моделированием доменной области, чтобы можно было дополнять её, что чуть не симпозиумы внутренние устраивают

Denis
18.10.2018
18:15:38
как вариант и рекорд

в пурсе есть оба, которые делаются через row polymorphism

Mikhail
18.10.2018
18:18:22
Народ, а есть единый стиль констант в хаскеле? Как например в си принято их писать с большой буквы или с маленькой k, а потом большими, напр. kCONSTANT = 5 в глобальном скопе

в чей код заглянуть, чтобы нахвататься правильного стиля? Вряд ли Prelude идеален в этом плане?

Андрей
18.10.2018
18:34:13
а большого выбора то и нет. с большой буквы не получится, с разделителями-минусами тоже ) остается снейк_кейс или камелКейс

хотя всякие штрихи` и прочие символы вносят свое разнообразие, это да

Александр
18.10.2018
18:39:01
Юникодом можно. Константы - на кириллице.

B. L.
18.10.2018
18:42:30
тогда уж жирным

Google
Mikhail
18.10.2018
18:45:25
арабской вязью лучше, чтобы никто не разобрался

Андрей
18.10.2018
18:46:48
не, эмодзи лучше



Mikhail
18.10.2018
18:53:50
и вязь в терминале показывает некорректно

B. L.
18.10.2018
18:54:35
{-# LANGUAGE UnicodeSyntax #-}?

Mikhail
18.10.2018
18:54:54
a, ок

тупая идея

лучше вариант с kCONSTANT

а юникод в листингах оставим для swift playgrounds

A64m
18.10.2018
19:05:56
Prelude> :set -XPatternSynonyms Prelude> pattern CONSTANT = 42 Prelude> CONSTANT 42 Prelude> case CONSTANT of CONSTANT -> True True

выбор есть

Alexander
18.10.2018
19:06:35
чего делать, в случае когда нужно бы сгенерить инстанс для Aeson но при этом бы навесить доп констреинтов

вот как умные люди поступают, чтобы без дубликации кода многого

kana
18.10.2018
19:11:42
чего делать, в случае когда нужно бы сгенерить инстанс для Aeson но при этом бы навесить доп констреинтов
наверное я не так понял вопрос, потому что ответ выглядит слишком простым instance SomeConstr a => FromJSON (F a) where parseJSON = genericParseJSON defaultOptions

Alexander
18.10.2018
19:12:52
не ограничения на значения внутри

типа одно поле больше другого и т.п.

kana
18.10.2018
19:13:40
ааа, ну это чет слишком круто для "сгенерить" звучит

Alexander
18.10.2018
19:14:01
т.е. я сделал Structure и ValidatedStructure

первое генерю автоматом

второе как parseJSON x = parseJSON »= \x -> checkAllStuff » pure (coerce x)

Google
Alexander
18.10.2018
19:15:14
ну и для FromJSON с Swagger используются автогенеренные инстансы

Oleg
18.10.2018
19:15:23
Alexander
18.10.2018
19:15:31
в структуре куда оно вложенно используется ValidatesStructure и coerce

но это как-то закат луны вручную

можно хотя свою генерацию запилить, куда можно передаваьт проверки

щас посмотрю что в swagger схеме нагенерилось

kana
18.10.2018
19:18:19
т.е. я сделал Structure и ValidatedStructure
а validated это просто newtype?

Alexander
18.10.2018
19:18:26
да

kana
18.10.2018
19:26:36
второе как parseJSON x = parseJSON »= \x -> checkAllStuff » pure (coerce x)
data A = A { x :: Int, y :: Int } validate :: MonadFail m => A -> m A validate a@(A x y) | x >= y = fail "x should be less than y" | otherwise = pure a instance FromJSON A where parseJSON = validate <=< genericParseJSON defaultOptions

Alexander
18.10.2018
19:27:01
не там хитрая генерация

я да и TH, generic тормоз

т.к. нужно делать свою обёртку куда validate передавать можно скорее всего

Maxim
18.10.2018
19:45:13
https://www.youtube.com/watch?v=o_4EX4dPppA смотрели? что он там говорит?

Alexander
18.10.2018
21:18:54
@A64m_qb0 как в aeson-lens достать в из ключа массив значений все определенного типа

^? "foo" . _Array ???

A64m
18.10.2018
21:23:30
^? key "foo" . _JSON :: Maybe (Vector Int)

@qnikst ^

Alexander
18.10.2018
21:25:07
прикольно

Страница 1528 из 1551