gpt4 book ai didi

Haskell Curl 帮助

转载 作者:行者123 更新时间:2023-12-02 23:13:35 27 4
gpt4 key购买 nike

好吧,我正在尝试用 Haskell 来理解 IO,我想我应该编写一个处理网页的简短小应用程序来完成它。我被绊倒的代码片段是(向 bobince 表示歉意,但公平地说,我并不想在这里解析 HTML,只是提取一两个值):

titleFromUrl url = do
(_, page) <- curlGetString url [CurlTimeout 60]
matchRegex (mkRegexWithOpts "<title>(.*?)</title>" False True) page

上面应该采用字符串形式的 URL,使用 matchRegex 扫描它指向的页面,然后返回 NothingJust [a],其中 a 是匹配的(可能是多行)字符串。令人沮丧的是,当我尝试这样做时

Prelude> (_, page) <- curlGetString url [CurlTimeout 60]
Prelude> matchRegex (mkRegexWithOpts "<title>(.*?)</title>" False True) page

在解释器中,它完全按照我的意愿行事。当我尝试加载相同的表达式以及从文件关联的导入时,它给我一个类型推断错误,指出它无法将预期类型“IO b”与推断类型“匹配”也许是[String]'。这告诉我我错过了一些小而基本的东西,但我不知道是什么。我尝试过将 page 显式转换为字符串,但这只是迷信编程(并且在任何情况下都不起作用)。

有什么提示吗?

最佳答案

是的,GHCi 接受任何类型的值。你可以说:

ghci> 4
4
ghci> print 4
4

但这两个值(4print 4)显然不相等。 GHC 的神奇之处在于,如果您输入的内容计算结果为 IO Something,那么它就会执行该操作(如果 something 不是 ())。如果没有,那么它会调用该值的 show 并打印该值。不管怎样,你的程序无法访问这个魔法。

当你说:

do foo <- bar :: IO Int
baz

baz 预计为 IO Something 类型,否则为类型错误。这将允许您执行 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(例如,也许[],...)这仍然是真的。

关于Haskell Curl 帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4191107/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com