所以>>= :: m a -> (a -> m b) -> m b和>> :: m a -> m b -> m b。
而<* :: f a -> f b -> f a.
但是我想要做一些做m a -> (a -> m b) -> m a的事情,也就是实际上放弃计算结果,并保留原来的。在我的例子中,这个计算结果只是返回()的IO操作,所以我只需要传递原始值。
有这样的功能吗?如果没有,我该怎么写呢?还没想清楚。谢谢!
发布于 2014-03-03 07:19:11
discardResult mx mf = do x <- mx
mf x
return x尽管jozefg的解决方案更简单。
发布于 2014-03-03 12:48:18
discard :: Monad m => m a -> (a -> m b) -> m a
discard g f = g >>= ((>>) <$> f <*> return)使用Applicative实例(->)使其更短一些,但在其他方面等同于Alexey的答案。当然,这需要Control.Applicative,但是由于您提到了<*,我想您已经有了这一项。
例如:discard getLine print读取一行,打印它,然后返回字符串读取。
https://stackoverflow.com/questions/22140672
复制相似问题