Это должно быть легко для Haskell профи ..Что похоже на fmap для монадических значений?
У меня Maybe значение,
> let a = Just 5
Я могу распечатать его:
> print a
Just 5
Но я хочу, чтобы применить I/O действия внутри «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()))
Очевидно, я немного запутался о монад-внутри-монады .. может кто-нибудь сказать мне правильный путь к наиболее лаконично выразить это?
Спасибо.
Btw 'print <$> a' точно такой же, как' fmap print a', –