BytesPrimL代表什么?如何生成含其的Exp表达式?
解析Haskell的
BytesPrimL构造函数 它到底代表什么?
BytesPrimL是GHC抽象语法树(AST)里Lit类型的构造函数,用来表示原始字节序列字面量——简单说就是一段直接指向内存的不可变二进制数据块,和WordPrimL(单个Word原始值)、CharPrimL(单个Char原始值)不同,它处理的是数组级别的二进制内容。
哪些代码会生成带BytesPrimL的Exp?
主要有两类场景:
- 编译期可确定的静态二进制数据:当你写的代码里有编译时就能确定内容的字节序列,GHC会把它转成
BytesPrimL节点。比如启用OverloadedStrings后定义静态ByteString:
开启优化编译时,GHC会把这个字符串直接编译为{-# LANGUAGE OverloadedStrings #-} import Data.ByteString (ByteString) myStaticBytes :: ByteString myStaticBytes = "foo bar"BytesPrimL形式的AST,嵌入到最终代码里。 - Template Haskell手动构造:就像你示例里那样,通过
mkBytes创建Bytes实例再包装成BytesPrimL,这种方式常用于在TH代码里动态生成二进制数据字面量。
为什么ppr只显示""?
因为BytesPrimL对应的是任意二进制数据,可能包含不可打印字符或者超长内容,ppr为了避免输出乱码或冗余信息,就统一用<binary data>占位。如果要查看具体字节,你可以手动读取内存里的内容:
import Foreign.ForeignPtr (withForeignPtr) import Foreign.Ptr (plusPtr) import Foreign.Storable (peekByteOff) import GHC.Types (Bytes(..)) printRawBytes :: Bytes -> IO () printRawBytes (Bytes fp offset length) = withForeignPtr fp $ \basePtr -> mapM_ (\i -> peekByteOff (basePtr `plusPtr` offset) i >>= print) [0..length-1]
内容的提问来源于stack exchange,提问作者fluffyyboii
相关产品推荐
相关产品推荐

