这行代码应返回一个字符串,但它返回IO(String)。
simpleHTTP(getRequest" http://www.haskell.org/")>> = fmap(取100)。 getResponseBody
如何将上面一行的返回值传递给getAllTextMatches?
import Network.HTTP
import Text.Regex.Posix
search :: String -> IO(String)
search url = do
let link = (simpleHTTP (getRequest url) >>= fmap (take 50000). getResponseBody)
getAllTextMatches (link =~ "(<[a-zA-Z]+>)|(<[a-zA-Z][a-zA-Z]*\s)" :: AllTextMatches [] String)
答案 0 :(得分:6)
您需要在第一行使用<-
代替let
,=
let link = (simpleHTTP (getRequest url) >>= fmap (take 50000). getResponseBody)
应该是
link <- simpleHTTP (getRequest url) >>= fmap (take 50000). getResponseBody
这是因为你正在与外界沟通,而这一切都需要在IO monad中发生。
然后链接将是String
,您可以这样处理。
在功能结束时,您还需要return
类型String
。
更新 -
这是一个为我编译的实际代码段:
search :: String -> IO [String]
search url = do
link <- (simpleHTTP (getRequest url) >>= fmap (take 50000). getResponseBody)
return $ getAllTextMatches (link =~ "(<[a-zA-Z]+>)|(<[a-zA-Z][a-zA-Z]*\\s)" :: AllTextMatches [] String)
请注意,getAllTextMatches
会返回String
的列表,而不是String
,因此我必须将search
的类型更改为String->IO [String]
。如果要保留类型,则必须相应地更改代码。
答案 1 :(得分:0)
在Monad
类型类中,>>=
运算符(发音为 bind )定义为
(>>=) :: m a -> (a -> m b) -> m b
其中m
是一些monad。在您的示例中,simpleHTTP (getRequest url)
是定义的m a
部分,fmap (take 50000) . getResponseBody
是(a -> m b)
部分。 >>=
运营&#34;内部&#34;您的问题建议使用IO
monad,因此>>=
的结果属于IO x
类型(在您的示例中将x
替换为String
)。要从do
块中的monad中提取基础值,请使用<-
,如下所示:
link <- (simpleHTTP (getRequest url) >>= fmap (take 50000). getResponseBody)