Это должно быть легко для профессионалов Haskell.
У меня есть значение Maybe,
> let a = Just 5
Я могу напечатать его:
> print a
Just 5
Но я хочу применить действие ввода-вывода к внутренней части Maybe. Единственный способ, которым я понял, как это сделать, не используя case
:
> maybe (return ()) print a
5
Однако это кажется слишком многословным. Прежде всего, return ()
специфичен для монады ввода-вывода, поэтому мне нужно придумать другой "ноль" для каждой монады, в которой я хочу попробовать этот трюк.
Я хочу в основном отобразить действие ввода-вывода (печать) на значение Maybe и напечатать его, если оно Just
, или ничего не делать, если оно Nothing
. Я хочу как-то выразить это,
> fmap print a
Но это не работает, поскольку print
является действием IO:
No instance for (Show (IO ()))
Я пробовал Applicative
, но не могу понять, есть ли способ выразить это:
> print <$> a
No instance for (Show (IO ()))
Очевидно, я немного запутался в монадах-внутри-монадах. Может ли кто-нибудь сказать мне правильный способ наиболее кратко выразить это?
Спасибо.