Haskell卷曲帮助
好吧,我正试图在
Haskell中围绕IO,我想我会写一个处理网页的小应用程序来做它.我被绊倒的片段是(道歉到
bobince,虽然公平地说,我不是在这里解析HTML,只提取一个或两个值):
titleFromUrl url = do (_,page) <- curlGetString url [CurlTimeout 60] matchRegex (mkRegexWithOpts "<title>(.*?)</title>" False True) page 上面应该采用字符串形式的URL,使用matchRegex扫描它指向的页面,并返回Nothing或Just [a],其中a是匹配的(可能是多行)字符串.令人沮丧的是,当我尝试做的时候 Prelude> (_,page) <- curlGetString url [CurlTimeout 60] Prelude> matchRegex (mkRegexWithOpts "<title>(.*?)</title>" False True) page 在翻译中,它正是我想要的.当我尝试加载相同的表达式以及从文件中关联的导入时,它会给我一个类型推断错误,指出它无法将预期类型’IO b’与推断类型’Maybe [String]’匹配.这告诉我,我错过了一些小而基本的东西,但我无法弄清楚是什么.我已经尝试将页面显式地转换为字符串,但这只是迷信编程(并且它在任何情况下都不起作用). 任何提示? 解决方法
是的,GHCi接受任何价值.你可以说:
ghci> 4 4 ghci> print 4 4 但是这两个值(4和4)显然不相等. GHC的神奇之处在于,如果您键入的内容对IO进行了评估,那么它会执行该操作(如果某些内容不是()则打印结果).如果没有,则调用值显示并打印出来.无论如何,你的程序无法访问这个魔法. 当你说: 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函数将返回值转换为IO值: 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,[],…),它仍然是真的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |