关于使用背包的例子

Dam*_*les 9 haskell typeclass type-families haskell-backpack

我正在查看backpack维基上的引用, 试图理解在哪些情况下使用backpack它将被认为适合于其他Haskell功能,如类型类和类型系列.

特别是,在作者的博客文章中backpack,提出了一个实例,用于实现正则表达式的简单匹配器.但据我所知,同一模块可以使用类型族进行编码.

是否有任何示例简明扼要地展示了背包相对于更传统的Haskell功能的优势?如果我上面提到的例子很好,你知道为什么使用类型系列的解决方案会不合适吗?

She*_*rsh 5

背包的主要优点:

  1. 保证没有性能开销(使用类型类可能会因为它们在 Haskell 中的实现方式而产生性能开销)。这在处理字符串数据类型、解析器、容器等时非常重要。
  2. 与类型类或类型系列的用法相比,代码更简洁、更漂亮。

我写了一篇关于 Backpack 的一个特殊用法的博客文章:为容器数据结构实现一个多态接口:

拥有这样的容器接口允许:

  1. 编写适用于任何容器(例如MapHashMapIntMap)的多态函数。
  2. 为容器的属性编写单个测试套件,并在没有代码重复的情况下在每个包中使用它。
  3. 编写一个单一的基准测试并在没有性能开销的情况下与每个容器数据结构一起使用。

如果条款使代码更清晰。这是groupBy使用 Backpack 实现的函数的签名:

groupBy :: forall k f a . (Foldable f, Key k) => (a -> k) -> f a -> Map k (NonEmpty a)
Run Code Online (Sandbox Code Playgroud)

很明显,它只是一个普通的 Haskell。如果您使用类型类和类型系列为容器实现接口(这是relude完成的,此签名将如下所示:

groupBy
    :: forall f t a . (Foldable f, DynamicMap t, Val t ~ NonEmpty a, Monoid t)
    => (a -> Key t) -> f a -> t
Run Code Online (Sandbox Code Playgroud)

更难阅读和理解。

最近讨论了当您需要编译面向不同平台的 Haskell 代码(也称为条件编译)时,Backpack 可以帮助避免 CPP。