Haskell如何存储返回值并将其与正则表达式匹配?

时间:2016-04-14 21:09:26

标签: haskell

这行代码应返回一个字符串,但它返回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)

2 个答案:

答案 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)