相关疑难解决方法(0)

如何处理添加新包依赖项的功能请求

我是hackage,lrucache包的维护者.我最近收到了为Binary和添加实例的功能请求NFData.这些都是有用的东西,原则上我对这些实例没有任何问题.

但是,它们都引入了新的包依赖关系,我希望尽可能减少我的包的依赖列表.有理智的方法来处理这个问题吗?可能有二十多个不同的包提供了lrucache可以实现的数据结构的有用类型类,并从中获得了一些好处.

显然,将所有这些作为依赖项添加是非启动性的.但还有什么可以做呢?

我可以向lrucache.cabal添加标志,以便编译各种实例.这样做可以使依赖列表最小化,除非您需要它.但它在现实世界中是可怕的,因为你无法在build-depends部分中指定构建标志.因此,您可以依赖具有特定标志的包,但不指定该依赖关系.这很快就会减少到无用的程度.

我可以创建一堆孤立实例包.这样做的好处是可以在build-depends部分中指定对这些实例的依赖性.它的主要缺点是在hackage中添加了大量额外的包,并且需要将它们作为单独的包维护.

我还可以做些什么?什么是正确的做法?

haskell cabal hackage

15
推荐指数
1
解决办法
304
查看次数

如何覆盖包代码提供的Haskell类型类实例?

我有一些旧的Haskell代码,包括QuickCheck测试用例.较新版本的QuickCheck(我刚刚升级到2.4.0.1)包括类型类实例Arbitrary Word8和其他版本.这些在Test.QuickCheck.Arbitrary的旧2.0.x版本中不存在.

虽然在一般意义上有用,但是包提供的Arbitrary Word8生成器不是我想要用于我的测试套件的生成器:

instance Arbitrary Word8 where
  arbitrary = frequency [(2, oneof [return ctrlFrameDelim, return ctrlEscape, return ctrlXon, return ctrlXoff]),
                         (8, choose (0, 255))]
Run Code Online (Sandbox Code Playgroud)

上面的代码在编译时导致重复的实例声明错误.我可以使用默认生成器来获取此代码,但我想知道解决此问题的正确方法.

我考虑(但未测试)的一种可能的解决方案是Word8使用别名newtype.这将导致整个来源的许多变化,所以我希望有一个更清洁的方式.

编辑:如下面的评论所述,接受的答案非常简洁,易于实施:

newtype EncodedByte = EncodedByte Word8

instance Arbitrary EncodedByte where
  arbitrary = liftM EncodedByte $ frequency [(2, elements [ctrlFrameDelim, ctrlEscape, ctrlXon, ctrlXoff]),
                                             (8, choose (0, 255))]
Run Code Online (Sandbox Code Playgroud)

haskell quickcheck

11
推荐指数
1
解决办法
3455
查看次数

标签 统计

haskell ×2

cabal ×1

hackage ×1

quickcheck ×1