主要观点:
- 用线性类型可精确捕捉套接字状态,此篇应用该思想处理网络中发送和接收富结构化数据类型且尽量减少复制的问题。
- 介绍紧凑范式(compact normal forms),可省去专门序列化表示而直接通过网络发送指针表示,能减少复制次数并带来缓存友好等好处。
- 还提到直接用序列化表示编程虽有性能优势但很棘手,易出错,而线性类型可确保数组观察纯净等,最后给出相关代码实现服务中对树的操作。
关键信息:
- 数据类型
Tree
为Branch Tree Tree | Leaf Int
。 - 网络通信过程需复制树结构 5 次,序列化和反序列化开销大。
- 紧凑范式在 GHC 8.2 引入,可将数据复制到连续内存区域发送。
- 直接用序列化表示编程需注意避免不一致和不完整的树,线性类型可确保数组纯净。
- 给出服务中对树操作的代码,如
add1
函数等。
重要细节:
compact
将树复制为适合网络通信的形式,unCompact
免费且为指针表示。Packed
数据类型用于表示树的序列化形式,caseTree
是模式匹配构造。Need
类型用于表示写缓冲区,leaf
和branch
等函数用于构建树。alloc
用于分配数组且必须线性使用。- 最终实现了在 Haskell 中无需额外复制即可通信和计算树的方法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。