所以>>= :: 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操作,所以我只需要传递原始值。
有这样的功能吗?如果没有,我该如何撰写?避风港成功解决了这个问题。谢谢!
答案 0 :(得分:10)
discardResult mx mf = do x <- mx
mf x
return x
虽然jozefg的解决方案更简单。
答案 1 :(得分:3)
discard :: Monad m => m a -> (a -> m b) -> m a
discard g f = g >>= ((>>) <$> f <*> return)
使用Applicative
的{{1}}实例使其缩短一点,但在其他方面等同于Alexey的答案。当然这需要(->)
,但是既然你提到了Control.Applicative
我认为你已经有了<*
。
例如:discard getLine print
读取一行,打印出来然后返回读取的字符串。