
Alexander
18.09.2017
22:03:01
в первой ветке SAllIntent IntentTask, во второй SAllIntent IntentChart`
тут только если unsafeCoerce ?
но это странный путь
вообще скорее надо так:

Google

Vyacheslav
18.09.2017
22:03:45
ну так я хочу чтобы результат был полиморфен по b


Alexander
18.09.2017
22:03:54
data SomeIntent = SomeIntent (forall s . SAllIntent s))
как?
если ты его таким делаешь то это значит, что юзер может попросить конкретный b какой хочет
а не ты его определяешь
пути решения:
1. колдовать с сиглетонами и eqT
2. написать instance SAllIntent SIntentTask и instance SAllIntent SIntentChart
3. сделать data SomeIntent
про первое лучше к @int_index обратиться, поидее оно должно решаться, но я такой ад не люблю и не знаю точно
@termina1 у тебя есть пример на 1 файлик, я могу поиграться тогда локально
о, там ещё и type synonym
ты точно делаешь то,что надо?
@termina1 это компиляется:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson
import Data.Singletons
import Data.Singletons.TH
singletons [d|
data AIIntent = IntentTask | IntentChart
|]
instance FromJSON (SAIIntent 'IntentTask) where
parseJSON (String "create_task") = return SIntentTask
parseJSON _ = fail "foo"
instance FromJSON (SAIIntent 'IntentChart) where
parseJSON (String "send_task") = return SIntentChart
parseJSON _ = fail "Unknown action"
как я и говорил, но учитывая TypeSynonymInstances я бы наверное испугался это запускать ?


Vyacheslav
18.09.2017
22:16:55
короче я кажется смог

Google

Vyacheslav
18.09.2017
22:17:05
через какое-то подобие зависимой пары

Alexander
18.09.2017
22:20:04
я задачу до конца не знаю так что..

Vyacheslav
18.09.2017
22:20:58
ну это я про другое

Ilya
18.09.2017
22:21:07


Alexander
18.09.2017
22:23:37
@Masteroid не удобно
доабвлять удалять сортировать и диффы больше
а переключаться между стилями ради пасты лень
@termina1 https://gist.github.com/qnikst/5579254757eb7d40f1e50a2e4039c60d
смотри, там инстансы для конкретных и неизвестно какого типа
Just IntentTask
Nothing
Nothing
Just IntentChart
Just task
Just chart

Vyacheslav
18.09.2017
22:25:46
ты в итоге спрятал a

Alexander
18.09.2017
22:25:46
выхлоп test

Vyacheslav
18.09.2017
22:25:48
а она мне нужна

Alexander
18.09.2017
22:26:14
что значит спрятал, инстанса с неспрятанным a быть не может

Vyacheslav
18.09.2017
22:26:30
ну да, поэтому я в целом кажется по другому решил эту проблему

Alexander
18.09.2017
22:27:00
ну вот у меня все решается, если юзер знает a он дает конкретное, если не знает до достает `SI`и делает case
там внутри будут 2 ветки, в каждой из которых значение определено
но вообще эта задача не похожа на разумную

Vyacheslav
18.09.2017
22:29:38
задача в целом разумная
просто не для хаскелла

Google

Vyacheslav
18.09.2017
22:32:24
@qnikst спасибо, идею кажется понял попробую так


Alexander
18.09.2017
22:32:41
для хаскела подходит любая задача
это ж у тебя должен был быть случай где запрос определяет ответ?
просто если сформулируешь задачу, то возможно я знаю решение неплохое без синглтонов как библиотеки, но то же по принципу
@termina1 вообще я нашёл исходный пост и подозреваю, что проще будет как писал @int_index просто ADT
data Action where
CreateChart :: String -> String -> Action
CreateTask :: String -> Data -> String -> Action
instance FromJSON Action where
parseJSON x = object "task" $ \o ->
asum [ CreateChart <$> o .: "create_chart"
<*> (o .: "params" >>=) .: "url"
, CreateTask <$> o .: "create_task")
<*> (o .: "params" >>=) .: "date"
<*> (o .: "params" >>=) .: "something"
]
что тут есть - возвращается правильный Action с правильными параметрами
почему так, т.к. у тебя запрос формируется из данных в одном месте и здесь гораздо проще поддерживать консистентность таким образом
GADT и DataKinds и Singletons нужны уже если нужно связывать между собой вещи в разных местах
впрочем часто можно обойтись и без:
data SomeAction = CreateAction CreateChart | TaskAction CreateTask
тогда посте паттерн матчинга можно таскать с собой объект


Aleksey
19.09.2017
07:37:28
Как в TH, имея reified тип, применить оный в сигнатуре выражения, вычисляемого в шаблоне?
Мне нужно специфицировать тип для полиморфной функции, которую я дёргаю в шаблоне
Хотя не, я хочу от TH того, чего он не может мне дать :(

Denis
19.09.2017
07:47:10
ну что за убожество https://medium.com/javascript-scene/javascript-monads-made-simple-7856be57bfe8

illiatshurotshka❄️
19.09.2017
07:48:38
>медиум
>что за убожество
тавтология

Aleksey
19.09.2017
07:50:41
Ну так на медиум такие статьи и пишут в основном. Кроме медиума ещё на dev.to такое часто встречается

Vyacheslav
19.09.2017
07:51:55

Alexander
19.09.2017
07:52:08
а чем она точнее?
у тебя тут явно связан тип запроса и параметры

Vyacheslav
19.09.2017
07:52:52
Тем что в объекте есть поле action, от которого зависит тип поля parameters

Google

Vyacheslav
19.09.2017
07:53:11
Тип запроса я заранее не знаю
А тут я эту связь типа действия и типа параметров никак не отражаю
Поэтому она менее точная

Vasiliy
19.09.2017
08:08:20
CreateChart :: String -> String -> Action - по-моему, вполне точная связь между CreateChart и парой строк

Alexander
19.09.2017
08:16:40
у меня в коде абсолютно точная связь между action и parameters
и предположения о том, что мы знаем тип запроса нет

Vyacheslav
19.09.2017
08:28:49
Нет, никакой связи, она только на уровне кода выражена
А на уровне типов нет
То есть я из типа общего результата не могу сказать какие параметры он содержит

Alexander
19.09.2017
08:50:55
ложь
точнее не так
из *типа* результата, ты знаешь какие параметры он содержит
с другой стороны с + одним слоем индирекции уже можешь
как я написал выше
решение с дата кайнд не приносит ни единого плюса по сравнению с таким решением в этой задаче

Vyacheslav
19.09.2017
08:56:20

Alexander
19.09.2017
08:56:40
но ты и с синглетонами это не знаешь
максимум ты можешь вернуть это dependent pair или аналог
это *ничем* не отличается от того, что ты вернёшь data Action = ActionTask AITask | ActionChart AICHart ; data AITask = AITask TaskParams ; data AIChart = AICHart CHartParams
dependent pair не дает никакого плюса по сравнению с этим решением

Google

Alexander
19.09.2017
08:58:40
т.к. конструктор в ActionTask, ActionChar играет ту же роль, что и синглтон
а пишется все на порядок проще

Vyacheslav
19.09.2017
09:04:18
Не полиморфный ко кайнду

Alexander
19.09.2017
09:04:51
мне кажется, что вчера весь разговор был из того, что ты не знаешь что приходит?
это уже другое дело

Vyacheslav
19.09.2017
09:05:11
Есть функция которая должна быть полиморфно, а другим необязательно
В общем, попытка запихнуть завтипы в хаскелл без полной из поддержки пока провалилась

Alexander
19.09.2017
09:07:54
я вчера написал работающий код, какая в нём проблема?
SI это был тебе dependent-pair, это не тот случай, где в haskell нельзя реализовать ничего
@termina1 в общем напиши список функций, которые тебе нужны и я модифицирую вчерашний пример

Vyacheslav
19.09.2017
10:09:40
спасибо, я подход понял, дальше сам)

Alexander
19.09.2017
10:11:08
я просто несколько написал, я бы навернове сам запутался
из гиттера попросили передать:
> Nop Nopovich @Nop58284650_twitter 13:22
> привет всем
> прост хочу сказать, что к нам на fby.by в этом году приедут Миша Снойман (автор Yesod), Бартош Милевский (https://bartoszmilewski.com/), Денис Шевченко (https://www.ohaskell.guide/), Алехандро Серано Мена (https://www.amazon.com/Beginning-Haskell-Alejandro-Serrano-Mena/dp/1430262508) и много других спикеров
> Ждем вас в гости!

Dmitry
19.09.2017
10:36:31
Александр Вершилов: спасибо, что запулил моё сообщение
ну я еще добавлю от себя. что конфа пройдет 17-го декабря, и что помимо докладов будут еще воркшопы по Elm и Haskell

Anatolii
19.09.2017
10:37:07
Может его запинить?

Vadim
19.09.2017
10:38:37
у вас на сайте написано 2016 год