2016-11-24 1 views
2

Ich teste einige HTTP-Anforderungen in Haskell und habe die folgenden Methoden:I/O Monad und ByteString zu Char Konvertierung?

import qualified Data.ByteString.Lazy as LAZ 
import Language.Haskell.TH.Ppr 
import System.IO 
import Data.Word (Word8) 

request :: IO LAZ.ByteString 
request = do 
    response <- simpleHttp "https://www.url.com" 
    return (response) 

exampleFunctionOne:: IO LAZ.ByteString -> IO LAZ.ByteString 
exampleFunctionOne bytes = do 
    html <- bytes 
    let bytesToChars = bytesToString $ LAZ.unpack html 
    let x = exampleFunctionTwo bytesToChars 
    bytes 

exampleFunctionTwo :: [Char] -> [Char] 
exampleFunctionTwo chars = --Do stuff... 

main = do 
    exampleFunctionOe $ request 

Meine Fragen sind:

  1. Gibt es einen straight forward Weg, um das ByteString auf [Char] zu konvertieren ? Derzeit muss ich konvertieren (ByteString -> Word8) und dann (Word8 -> Char)

  2. Bin ich richtig sagen, die 'return()' Anweisung in meiner Anfrage-Funktion ist einfach die erneute Anwendung Monade-Kontext (in diesem Fall IO) auf den Wert, den ich extrahiert habe (Antwort < - simpleHttp)? Oder hat es einen zusätzlichen Zweck?

+1

Seien Sie vorsichtig hier. Eine Byte-Zeichenfolge ist NICHT tatsächlich in eine Liste von Zeichen umwandelbar, es sei denn, wir kennen ihre Codierung. 'Char8' nimmt latin-1 an, was beliebig ist. AFAICS, der allgemeine Trend verwendet utf8 für den größten Teil des Textes im Netz. In html zum Beispiel wird die Codierung manchmal innerhalb des HTML selbst erklärt, was alles etwas komplexer macht. Ich hoffe, es gibt eine Bibliothek, die das halbtransparent irgendwo behandelt. – chi

Antwort

3

Um Ihre erste Frage, beachten Sie zu antworten, dass mit der Unterschrift Sie eine andere „entpacken“ in Data.ByteString.Lazy.Char8 gibt es: beide importieren

unpack :: ByteString -> String 

Es ist nicht ungewöhnlich, dass Menschen Module:

import qualified Data.ByteString.Lazy as B 
import qualified Data.ByteString.Lazy.Char8 as C 

und mischen und entsprechen Funktionen von jedem.

Um Ihre zweite Frage zu beantworten, ja das ist mehr oder weniger es. Zum Beispiel:

redund = do x <- getLine 
      y <- return x 
      z <- return y 
      u <- return z 
      return u 

ist alles entsprechen redund = getLine mit einem Bündel von Wieder Umhüllen und Extrahieren von reinem Wert in eine aus einer IO monadisch.

Verwandte Themen