169 похожих чатов

Ещё, не относящийся к предыдущему, вопрос: Есть конечный автомат. У него

часть переходов примитивные, а часть сами представляют собой автоматы. Нужно бегать по состояниям и, в некоторых случаях, просматривать подробнее, что за автоматы на переходе. Пока придумал такое решение: хранить на переходах идентификаторы и отдельно Map ID -> Automata. Но тут не очень красиво то, что Map и ID-шники на переходах вообще никак не связаны и поэтому каждый раз при lookup приходится бросать исключение, если не нашлось. Есть ли какой-нибудь сделать так, чтобы на уровне типов было ясно, что исключений тут не будет на самом деле? Понимаю, что, наверное, из соображений простоты и эффективности всё равно вряд ли что-то лучше Map придумаешь, но хотя бы просто в образовательных целях

13 ответов

23 просмотра

на уровне типов исключений в любом случае нет

можно к Map применить (!), чтобы избавиться от Maybe, если вы уверены, что ключ всегда в словаре

можно на уровне типов доказать, что ключ в каком-то множестве, но если это множество формируется во время исполнения, то доказать это будет весьма тяжело

Лев-Дворкин Автор вопроса
Cheese Syrowiecki
можно к Map применить (!), чтобы избавиться от May...

о, как-то не заметил такую полезную функцию. Естественно, сам написал подобное, но лучше стандартным пользоваться, конечно

Лев Дворкин
о, как-то не заметил такую полезную функцию. Естес...

она невразумительное исключение кидает, если программист всё-таки ошибся, и ключа нет, так что своё часто пишут

Лев-Дворкин Автор вопроса
Cheese Syrowiecki
можно на уровне типов доказать, что ключ в каком-т...

ну, я так и думал, на самом деле, что можно, но очень сложно :) спасибо

Лев-Дворкин Автор вопроса
Cheese Syrowiecki
она невразумительное исключение кидает, если прогр...

а, ну это да можно написать что-то вроде "несуществующий ID автомата", а не "ключ не найден"

Лев-Дворкин Автор вопроса

Да, HasCallStack — то, что нужно. Только вот добавлять его, видимо, нужно не к вызывающей функции, а к самому (!). В общем, так заработало: (!) :: (HasCallStack, Ord k) => Map k a -> k -> a m ! k = case M.lookup k m of Nothing -> error "(!) given key is not an element in the map" Just a -> a странно, почему тогда бы HasCallStack в Data.Map не прописать. Это какие-то ограничения на использование накладывает?

Лев Дворкин
Да, HasCallStack — то, что нужно. Только вот добав...

HasCallStack: Pros: Can be used on all platforms; provides precise backtraces Cons: Requires manual modification of the source program; runtime overhead

Лев Дворкин
Да, HasCallStack — то, что нужно. Только вот добав...

Вообще есть вот такой пропосал, который пилится https://github.com/bgamari/ghc-proposals/blob/stacktraces/proposals/0000-exception-backtraces.rst

Лев-Дворкин Автор вопроса
Aleksandr Khristenko
HasCallStack: Pros: Can be used on all pla...

в данном случае мешает runtime overhead, да?

Лев Дворкин
в данном случае мешает runtime overhead, да?

На самом деле хз, можно вот это почитать https://gitlab.haskell.org/ghc/ghc/-/issues/17040 там как раз предлагали добавить HassCallStack для всех частичных функций в base

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта