2017-05-05 60 views
1

standalone working script,我有一个函数返回IO()这样:转换功能,putStrLn'd返回字符串

main :: IO() 
main = do 
    response <- simpleHttp "https://leonstafford.github.io" 

    let body = decodeUtf8 (response) 
    let bodyAsString = unpack (body) 

    putStrLn $ htmlToPlainText bodyAsString 

现在我试图利用同样的功能在this existing script,但与普通Couldn't match type ‘[Char]’ with ‘Char’挣扎:

renderPage :: String -> String 
renderPage url = do 
    response <- simpleHttp url 

    let body = decodeUtf8 (response) 
     bodyAsString = unpack (body) 
     articleAsPlainText = htmlToPlainText bodyAsString 
    return articleAsPlainText 

我一直在摆弄它和关闭了大约一个星期,希望我已经能够在标题足够的定义问题,所以它可能不是另一个can't match expected types后,虽然上午PRET肯定就是这样。

+3

'renderPage ::字符串 - > IO String' – melpomene

+0

没有这样的运气'预期类型:字符串实际类型: IO字符串' –

+2

您删除了错误消息中最重要的部分:文件名/行号。新的错误发生在哪里? – melpomene

回答

3

关于Haskell的好处是你可以一步一步做到这一点,大多数人并不担心你会得到完全不同的行为。首先,我们移动的main内容到一个新的功能:

renderPage :: IO() 
renderPage = do 
    response <- simpleHttp "https://leonstafford.github.io" 

    let body = decodeUtf8 (response) 
    let bodyAsString = unpack (body) 

    putStrLn $ htmlToPlainText bodyAsString 


main :: IO() 
main = renderPage 

接下来,我们添加url作为参数:

renderPage :: String -> IO() 
renderPage url = do 
    response <- simpleHttp url 

    let body = decodeUtf8 (response) 
    let bodyAsString = unpack (body) 

    putStrLn $ htmlToPlainText bodyAsString 

main :: IO() 
main = renderPage "https://leonstafford.github.io" 

最后,但并非最不重要的,我们移动putStrLnmainrenderPage使用return

renderPage :: String -> IO String 
renderPage url = do 
    response <- simpleHttp url 

    let body = decodeUtf8 (response) 
    let bodyAsString = unpack (body) 

    return $ htmlToPlainText bodyAsString 

main :: IO() 
main = renderPage "https://leonstafford.github.io" >>= putStrLn 

这些步骤(迁入新功能,添加AR意见,移动功能)都非常小。所以当你遇到这样的问题时,不要害怕做一些中间步骤。

请注意,IO始终保持renderPage,因为simpleHttp使用IO。一旦你在某个函数中有某处,就无法摆脱IO。但renderPage的功能可以被重新使用,因为

renderPage :: String -> IO String 
renderPage = fmap (htmlToPlainText . unpack . decodeUtf8) . simpleHttp 

,因此:

utf8ToPlainText :: ByteString -> String 
utf8ToPlainText = htmlToPlainText . unpack . decodeUtf8 

renderPage :: String -> IO String 
renderPage = fmap utf8ToPlainText . simpleHttp 
+0

@Franky:谢谢你的修复。 – Zeta

+0

真诚感谢您的回答/评论。将Haskell作为n00b既是艰巨的,也是有趣的。我一个星期前没有信心写这个问题。 –

+1

@LeonStafford:GIT GUD!呃,我的意思是,不客气。问一个问题通常没有什么坏处,只要它是完整的。顺便说一句,'ask'通常具有'Monad m => ReaderT r m r'的类型,所以你需要将'ReaderT r IO a'转换回'IO a'。这通常使用'runReaderT'完成。但随意提出另一个问题。 – Zeta

相关问题