I / O Monad和ByteString到Char的转换?

时间:2016-11-24 22:55:15

标签: haskell io monads

我正在测试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

我的问题是:

  1. 有没有更简单的方法将ByteString转换为[Char]?目前我必须转换为执行(ByteString - &gt; Word8)然后(Word8 - &gt; Char)

  2. 我是否正确地说我的请求函数中的'return()'语句只是将monad上下文(在本例中为IO)重新应用于我提取的值(response&lt; - simpleHttp) ?或者还有其他目的吗?

1 个答案:

答案 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中。