有没有 - 一个 - > (a - > m b) - >在haskell中有一个函数类型?

时间:2014-03-03 07:07:38

标签: haskell monads

所以>>= :: 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操作,所以我只需要传递原始值。

有这样的功能吗?如果没有,我该如何撰写?避风港成功解决了这个问题。谢谢!

2 个答案:

答案 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读取一行,打印出来然后返回读取的字符串。