2017-05-05 96 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