gpt4 book ai didi

haskell - Data.ByteString.Lazy.Internal.ByteString 到字符串?

转载 作者:行者123 更新时间:2023-12-03 15:18:13 25 4
gpt4 key购买 nike

尝试编写一个返回我计算机的外部 IP 地址的模块。
使用 Network.Wreq get函数,然后应用一个镜头得到responseBody ,我最终得到的类型是 Data.ByteString.Lazy.Internal.ByteString .由于我想过滤掉结果正文的尾随“\n”,因此我想随后将其用于正则表达式。
问题: regex 库不接受看似非常特定的 ByteString 类型,我发现无法将其转换为 String .

到目前为止,这是我微弱的尝试(未编译)。

{-# LANGUAGE OverloadedStrings #-}

module ExtIp (getExtIp) where
import Network.Wreq
import Control.Lens
import Data.BytesString.Lazy
import Text.Regex.Posix

getExtIp :: IO String
getExtIp = do
r <- get "http://myexternalip.com/raw"
let body = r ^. responseBody
let addr = body =~ "[^\n]*\n"
return (addr)

所以我的问题显然是:如何将那个有趣的特殊 ByteString 转换为 String ?解释我如何自己解决这样的问题也值得赞赏。我尝试使用 unpacktoString但不知道要导入什么才能获得这些功能(如果存在)。

作为一个非常零星的haskell用户,我也想知道是否有人可以向我展示定义这种函数的惯用haskell方式。毕竟,我在这里展示的版本没有考虑可能的运行时错误/异常。

最佳答案

简短回答:使用 unpack 来自 Data.ByteString.Lazy.Char8

更长的答案:

通常,当您想将 ByteString(任何种类)转换为 String 或 Text 时,您必须指定编码 - 例如UTF-8 或 Latin1 等。

在检索 HTML 页面时,您应该使用的编码可能会在 Content-type header 或响应正文中显示为 <meta ...>标签。

或者,您可以猜测 body 的编码是什么。

在你的情况下,我假设你正在访问一个像 http://whatsmyip.org 这样的网站。你只需要解析出你的IP地址。因此,无需检查标题或浏览 HTML,使用的安全编码将是 Latin1。

要通过编码将字节字符串转换为文本,请查看 Data.Text.Encoding 中的函数

例如,decodeLatin1功能。

关于haskell - Data.ByteString.Lazy.Internal.ByteString 到字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37571939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com