我有一个来自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]
但是如果我使用地图,我很难搞清楚这个>> =打印命令的正确方法。
答案 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
希望
但我认为您真正想做的是打开网站并打印每个的结果(在没有列表括号的换行符上)