我有一个函数,我想使用Maybeval.通常我会这样做func <$> val.但现在假设func使用IO monad.func <$> val会回来的Maybe (IO ()).所以我必须定义一个新的运算符:
(<$$>) :: Monad m => (a -> m b) -> Maybe a -> m ()
(<$$>) func (Just val) = func val >> return ()
(<$$>) func Nothing = return ()
Run Code Online (Sandbox Code Playgroud)
所以现在我可以写func <$$> val,但是有更好的方法吗?
mapM_fromData.Foldable可能是最好的匹配:
Prelude Data.Foldable> :set -XScopedTypeVariables
Prelude Data.Foldable> :t \f (a :: Maybe a) -> Data.Foldable.mapM_ f a
\f (a :: Maybe a) -> Data.Foldable.mapM_ f a
:: Monad m => (a -> m b) -> Maybe a -> m ()
Run Code Online (Sandbox Code Playgroud)
如果您想要更专业的类型,还有maybe:
Prelude> :t \f -> maybe (return ()) (f $)
\f -> maybe (return ()) (f $)
:: Monad m => (a -> m ()) -> Maybe a -> m ()
Run Code Online (Sandbox Code Playgroud)