2016-11-07 3 views
1

I (New to Haskell) Я пытаюсь выполнить операцию распаковки на ByteString, которую я получаю с веб-страницы. В основном я хочу найти несколько слов с веб-страницы, поэтому я пытаюсь tokenize поток, а затем поиск слова из слов.Понимание ошибки в haskell

Prelude Network.HTTP.Conduit LB> LB.unpack (simpleHttp WebLink) 

Но я получаю ниже ошибки

<interactive>:75:12: error: 
• Couldn't match expected type ‘LB.ByteString’ 
       with actual type ‘m0 LB.ByteString’ 
• In the first argument of ‘LB.unpack’, namely... 

От hackage я могу видеть, что его подпись

unpack :: ByteString -> [Word8] Source 
O(n) Converts a ByteString to a '[Word8]'. 

ответ

3

simpleHttp "http://example.com" имеет тип m ByteString, для некоторой монады m, поэтому, например, тип IO ByteString. Используя do, вы можете получить результат.

import Network.HTTP.Conduit 
import qualified Data.ByteString.Lazy.Char8 as LB 

main :: IO() 
main = do 
    res <- simpleHttp "http://example.com" 
    let string = LB.unpack res 
    putStr string 

Или в GHCI,

ghci> res <- simpleHttp "http://example.com" 
ghci> LB.unpack res 
2

simpleHttp WebLink, как представляется, монадическая действие, которое возвращает значение, это не сам ByteString. Вы должны запустить процедуру, получив значение, затем (предположив, что это байтовая строка), вы можете ее распаковать.

Обратите внимание, что процедура simpleHttp, которую я знаю, не возвращает байтов. Вам нужно сопоставить шаблон по возвращаемому значению, чтобы проверить тип Either, если это сообщение ответа вместо отказа, тогда вы можете продолжить сопоставление шаблонов в ответе.

+0

Спасибо Томас за ответ и объяснение проблемы. Можете ли вы предложить некоторую ссылку или какой-то пример, чтобы сделать то, что вы предложили? – Manvi

Смежные вопросы