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

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

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

13 ответов

27 просмотров

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

можно к 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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта