是的,GHCI接受任何价值。你可以说:
ghci> 4
4
ghci> print 4
4
但这两个价值观(
4
和
print 4
)显然不平等。神奇的是,如果您键入的值为
IO something
然后执行该操作(并打印结果,如果
something
不是
()
)如果没有,它就会打电话
show
在价值和打印。无论如何,你的程序无法访问这个魔法。
当你说:
do foo <- bar :: IO Int
baz
baz
应为类型
IO某物
,否则是类型错误。这将允许您执行I/O,然后返回一个纯值。您可以检查这一点,注意去除上述物质会产生:
bar >>= (\foo -> baz)
和
-- (specializing to IO for simplicity)
(>>=) :: IO a -> (a -> IO b) -> IO b
因此
bar :: IO a
foo :: a
baz :: IO b
修复它的方法是使用
return
功能:
return :: a -> IO a -- (again specialized to IO)
您的代码是:
titleFromUrl url = do
(_, page) <- curlGetString url [CurlTimeout 60]
return $ matchRegex (mkRegexWithOpts "<title>(.*?)</title>" False True) page
在上面的大多数讨论中,您可以用任何monad替换
IO
(例如)
Maybe
,
[]
,…)它仍然是真的。