У меня проблема, я не знаю, как рассуждать. Я собирался спросить, может ли кто-нибудь помочь мне с конкретной проблемой, но мне стало понятно, что я могу задать более общий вопрос и, надеюсь, получить лучшее общее понимание в результате. С надеждой. Итак, вот:
Это обычно достаточно очевидно, когда ваша программа слишком ленива, потому что вы в конечном итоге сталкиваетесь с такими яркими проблемами, как утечки пространства. У меня противоположная проблема: моя программа слишком строгая. Я пытаюсь связать узлы и найти, что некоторые вещи я пытаюсь сделать как-то победит лени, в которой я нуждаюсь. Итак, мой общий вопрос: как отлаживать нежелательную строгость?
Для полноты, здесь мой конкретный случай: я в RWS
, где компонент записи заполняет карту, а компонент читателя наблюдает за конечным состоянием этой карты. Я не могу сделать ничего строгого с этой картой, прежде чем закончить ее заполнение. Кажется, нет никакой проблемы для поиска значений на карте, например:
do
m <- ask
val <- m ! key
doSomething val -- etc.
Но (!)
не удается использовать error
, где вместо этого я предпочел бы потерпеть неудачу, используя мою монаду fail
. Поэтому я хотел бы сделать что-то вроде следующего:
do
m <- ask
maybe
(fail "oh noes")
(doSomething)
(lookup key m)
Это заставляет мою программу <<loop>>
, которую я не понимаю. Мне кажется, что это не должно быть более строгим, чем использование (!)
, но, очевидно, я ошибаюсь...