我正在测试haskell中的一些HTTP请求,并使用以下方法:
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
我的问题是:
有没有更简单的方法将ByteString转换为[Char]?目前我必须转换为执行(ByteString - &gt; Word8)然后(Word8 - &gt; Char)
我是否正确地说我的请求函数中的'return()'语句只是将monad上下文(在本例中为IO)重新应用于我提取的值(response&lt; - simpleHttp) ?或者还有其他目的吗?
答案 0 :(得分:3)
要回答您的第一个问题,请注意Data.ByteString.Lazy.Char8中有一个与您想要的签名不同的“解包”:
unpack :: ByteString -> String
人们导入这两个模块并不罕见:
import qualified Data.ByteString.Lazy as B
import qualified Data.ByteString.Lazy.Char8 as C
并混合和匹配每个函数。
回答你的第二个问题,是或多或少。例如:
redund = do x <- getLine
y <- return x
z <- return y
u <- return z
return u
完全等同于redund = getLine
,其中包含一堆重新包装并将纯值提取到IO monad中。