
Alexander
04.10.2018
20:39:13
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#extension-TypeApplications

A64m
04.10.2018
20:39:33
порядок параметров указывается в forall
для того чтоб ссылаться на параметры из схемы типа в коде функции надо ScopedTypeVariables
для того чтоб компилятор разрешал писать код, который без указания типов через @ не работает нужен AllowAmbiguousTypes

Google

Artem
04.10.2018
20:42:21
Спасибо большое
?
А как так может быть, что в do-нотации не выполняется одна из функций(в дебаге не заходит туда даже)?
ShouldBeDeleted msg -> model <# do
fetch $ deleteMessage msg
fetch $ banUser msg
return NoOpНе заходит в banUser
Я так понимаю это из-за ленивости
Но не пойму как это фиксить :С

Yuriy
05.10.2018
05:07:09
это функции из какой библиотеки?

kana
05.10.2018
05:23:17
На первый взгляд выглядит как из либы для элм-лайк телеграм-ботов физрука

Yuriy
05.10.2018
05:48:19
вряд ли там лень будет пропускать монадные действия
скорее, перепутался идентификатор пользователя или что-то в этом духе
или функция banUser не реализована
NoOp выглядит как-то подозрительно

Artem
05.10.2018
07:01:34
Все самописное
Хмм, просто когда я их меняю местами, у меня banUser вызывается, а deleteMessage - нет

Google

Yuriy
05.10.2018
07:19:13
instance Monad тоже самописный?

Alexander
05.10.2018
08:10:07
что за Monad там используется?

Artem
05.10.2018
08:28:55
Нет, ‘ClientM’ из Servant

Alexander
05.10.2018
08:36:25
а fetch откуда?
(или лучше как debug отладка сделана была(
т.к. у servant нормально с выполнением такого

Artem
05.10.2018
08:50:28
Это fetch
fetch :: ClientM a -> BotM ()
fetch a = void $ liftClientM $ aА дебажил с помощью ghci
Ох

Alexander
05.10.2018
08:51:42
вот, BotM а не client M

Artem
05.10.2018
08:51:48
Опростоволосился :(
Монада то не ClientM а BotM

Alexander
05.10.2018
08:51:51
откуда BotM и какой у него инстас monad

Anatolii
05.10.2018
08:52:40
это бот физрука
но с ним все ок

Artem
05.10.2018
08:53:07
Бибилотека telegram-bot-simple,
а BotM:
newtype BotM a = BotM { _runBotM :: ReaderT BotContext ClientM a }
deriving (Functor, Applicative, Monad, MonadReader BotContext, MonadIO)
Почему физрук? :D

Anatolii
05.10.2018
08:53:28
ну посмотри автора либы на гитхабе:)

Yuriy
05.10.2018
08:53:56
@fizruk31337

Artem
05.10.2018
08:54:00
Ааа, я только имя просто видел, nick_name не увидел
Забавно

Alexander
05.10.2018
09:00:29
страннота

Google

Alexander
05.10.2018
09:00:50
но, я бы дебажил через Debug.Trace.traceM

A64m
05.10.2018
09:29:51
Новых фич так мало, что я теперь отслеживаю даже нанофичи
### Allow (unparenthesized) kind signatures
https://github.com/ghc/ghc/commit/bace26aadaafa4064e78f9ed088c1e2217221acc
https://phabricator.haskell.org/D5173
[t :: MyKind]
(a :: k, b)
### Parse the (!) type operator and allow type operators in existential context
https://github.com/ghc/ghc/commit/bd7898537768f936d05c0c83eef1cd9b00933347
https://phabricator.haskell.org/D5180
class a ! b
data D4 = forall a b. a ! b => D4 !a !b

Anatolii
05.10.2018
09:30:51
Надо доки почитать
Может там ошибка возвращается от вам телеграмма

Artem
05.10.2018
09:33:58
Так я не юзера удаляю, а его сообщение

Alexander
05.10.2018
09:34:19
некоторые формы бана удаляют все сообщения кстати
во всяком случае если человек банит

Artem
05.10.2018
10:21:09
При дебаге просто пропускается строчка со второй функцией и сразу идет в return
:C
При том, что сообщение/или юзер удаляются("или"- потому что я менял местами их и смотрел в дебаге)

Alexander
05.10.2018
10:23:29
сделай traceM

Artem
05.10.2018
10:35:19
Оу
Он даже в return не идет
Вызывает banUser и все

Alexander
05.10.2018
10:36:20
может исключение какое?

Artem
05.10.2018
10:36:52
Но оно бы тогда отписало в терминале, правда?

Alexander
05.10.2018
10:37:27
наверное, но это не точно
зависит от того, что model делает

Kirill
05.10.2018
10:46:35
про исключения напомнило о том как acid-state их просто зажёвывает :)

Google

Alexander
05.10.2018
10:47:11
да, такое бывает

Artem
05.10.2018
11:06:18
И как их отловить, если они зажевываются?

Alexander
05.10.2018
11:13:10
ну сначала проверить зажевываются ли
вообще странно если это сгенерированное сервантом код то не должны

Kirill
05.10.2018
11:54:35
у серванта тоже есть тикет про ленивость, для сервера правда

Alexander
05.10.2018
11:56:48
ClientM это ExceptT IO

Kirill
05.10.2018
11:58:18
ну Handler тоже

Alexander
05.10.2018
11:59:08
если оно там все сверхленивое, то и deleteMessages незачем выполняться
хотя у меня нигде подобное поведение не наблюдается

Alexander
05.10.2018
11:59:43
а зачем вообще существует ленивое IO?

Alexander
05.10.2018
11:59:59
итеративность бесплатно

Kirill
05.10.2018
12:00:02
lazy IO тут вроде непричём

Alexander
05.10.2018
12:00:07
но поведение выше это не ленивое IO
ленивое IO это readFile
например
когда ты получаешь на выходе "строку" а по факту читаешь файл по надобности

Kirill
05.10.2018
12:02:40
ленивую "строку"

Alexander
05.10.2018
12:02:54
да

Maxim
05.10.2018
12:53:15
слушайте, а если я вызываю FFI функцию, которая внутри запускает свой event loop и управление назад в хаскель не отдает, ее можно как-то прибить асинхронным исключением из другого потока?

Google

A
05.10.2018
13:03:02
можно знаешь что?

Alexander
05.10.2018
13:03:44
@maksbotan есть interruptible

Maxim
05.10.2018
13:04:13
что interruptible?

Alexander
05.10.2018
13:04:33
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ffi-chap.html#interruptible-foreign-calls
посмотри как это там сделано
вообще чаще у event_loop есть свой API

Maxim
05.10.2018
13:05:46
ну у меня такой код
withAsync foo $ \t ->
link t
runUI
хочется, чтобы когда foo кидал исключение, runUI бы умирал
для этого я вписал link
но не работает, потому что runUI вызывает FFI, из которого нет возврата
можно запустить свой хендлер, который вызовет exit евент лупа если foo сдох...
что лучше, это или сделать interruptible?

Alexander
05.10.2018
13:07:59
зависит от того, что там в runUI

Maxim
05.10.2018
13:08:28
QCoreApplication.exec там
после всяких настроек

Alexander
05.10.2018
13:09:05
я ну буду читать их свойства, я не знаю как оно будет реагировать на сигнал
если умирать, то interruptible - ok