Эта функция не существует, потому что она не будет иметь смысла для всех монад. По сути, это эквивалентно функции распаковки монады Monad m => m a -> a
- единственное отличие состоит в том, что вы немедленно помещаете ее в другую монаду.
Причина, по которой эта функция не определена для всех монад, заключается в том, что она не имеет смысла для некоторых из них. Например, возьмите Maybe
: единственный способ распаковать это - выдать ошибку, если у вас есть Nothing
, а ошибки времени выполнения игнорируются. Более крайним примером будет IO
- использование функции, которая может «распаковать» значения IO
, приведет к странному и потенциально недетерминированному поведению.
Таким образом, у вас вообще нет такой функции. Тем не менее, многие специфические монады do поставляются с такими функциями. Отличным примером является runST
; это на самом деле безопасный способ иметь дело с государством. На самом деле у вас do есть такие функции как для Maybe
, так и для IO
(fromJust
и unsafePerformIO
соответственно), но у них есть проблемы, которые я описал выше, и вам следует их избегать.
Тогда решение вашей проблемы состоит в том, чтобы увидеть, существует ли такая функция для любых монад, с которыми вы имеете дело. Если есть, проверьте любые потенциальные ловушки - это вызывает ошибки во время выполнения или вызывает странное поведение?
В вашем случае, если вы абсолютно уверены, что Maybe
никогда не будет Nothing
, используйте fromJust
. Однако, как правило, это не очень хорошая практика, поэтому вы должны просто придерживаться шаблона, соответствующего значению из Maybe
.