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

标签 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 -> Word8),然后转换为 (Word8 -> Char)

  2. 我是否正确地说,我的请求函数中的“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/

相关文章:

haskell - `valueB` 是如何工作的?它总是返回相同的值?

haskell - 在 GHCi 中键入家庭恶作剧

haskell - 如何使变态与参数化/索引类型一起工作?

linux - 如何在linux中做异步IO?

haskell - 转换具有两个以上 Action 的 "do"表示法以使用绑定(bind)函数

haskell - 是否有 Monad 的实例但没有 MonadFix 的实例?

list - 从右到左处理 Haskell 列表,保持原始顺序

java - FileInputStream 和 FileNotFoundException

haskell - 对 "Learn you a Haskell"上的 State Monad 代码感到困惑

由于可移植性问题,Java 加载资源(图像、音频、文本文件等)而不使用 "/"符号并使用 File.separator