加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

Haskell卷曲帮助

发布时间:2020-12-14 01:13:49 所属栏目:Linux 来源:网络整理
导读:好吧,我正试图在 Haskell中围绕IO,我想我会写一个处理网页的小应用程序来做它.我被绊倒的片段是(道歉到 bobince,虽然公平地说,我不是在这里解析HTML,只提取一个或两个值): titleFromUrl url = do (_,page) - curlGetString url [CurlTimeout 60] matchRegex
好吧,我正试图在 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,[],…),它仍然是真的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读