我正在 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 -> Word8),然后转换为 (Word8 -> Char)
我是否正确地说,我的请求函数中的“return ()”语句只是将 monad 上下文(在本例中为 IO)重新应用到我提取的值(响应 <- simpleHttp)?或者它还有其他目的吗?
最佳答案
要回答您的第一个问题,请注意 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 中。
关于haskell - I/O Monad 和 ByteString 到 Char 的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40795502/