“>> =”运算符和“地图”功能

时间:2016-02-22 05:13:19

标签: haskell

我有一个来自openbrowser库示例的工作代码。

import Web.Browser (openBrowser)
main :: IO ()
main = openBrowser "http://haskell.org/" >>= print

我想做的是打开两个网站。

所以我觉得做的事情是:

main = map openBrowser ["http://haskell.org/","http://google.com/"] >>= print

我会得到

Couldn't match type ‘[]’ with ‘IO’
Expected type: IO (IO Bool)
Actual type: [IO Bool]

但是如果我使用地图,我很难搞清楚这个>> =打印命令的正确方法。

1 个答案:

答案 0 :(得分:3)

使用forM

在这种情况下,我会使用forM_

main = 
    forM_ ["http://haskell.org/","http://google.com/"] (openBrowser >=> print)

您可以使用重复对列表a -> IO b中的每个项目执行[a]操作并获取IO ()(操作的结果将是丢弃 - 使用我们想要的forM_版本,因为它应该是我们main所以它必须是IO () - forM版本会产生IO [()]代替)

使用mapM

或者如果您想更贴近您的想法,可以使用map mapM_代替:

main = 
    mapM_ (openBrowser >=> print) ["http://haskell.org/","http://google.com/"]

只是翻转参数的forM_ - 类型说明是一样的。

使用sequence

您的工作不起作用的原因是openBrowswer将返回IO Bool操作(或者似乎基于错误消息),因此map将返回{{1}但要使用[IO Bool],您需要一些(>>=)

因此,您需要先将折叠列表转换为一个IO a操作(可以使用sequence :: [IO a] -> IO [a]完成):

IO

应该打印列表main = sequence (map openBrowser ["http://haskell.org/","http://google.com/"]) >>= print 希望

但我认为您真正想做的是打开网站并打印每个的结果(在没有列表括号的换行符上)