我是hackage,lrucache包的维护者.我最近收到了为Binary和添加实例的功能请求NFData.这些都是有用的东西,原则上我对这些实例没有任何问题.
但是,它们都引入了新的包依赖关系,我希望尽可能减少我的包的依赖列表.有理智的方法来处理这个问题吗?可能有二十多个不同的包提供了lrucache可以实现的数据结构的有用类型类,并从中获得了一些好处.
显然,将所有这些作为依赖项添加是非启动性的.但还有什么可以做呢?
我可以向lrucache.cabal添加标志,以便编译各种实例.这样做可以使依赖列表最小化,除非您需要它.但它在现实世界中是可怕的,因为你无法在build-depends部分中指定构建标志.因此,您可以依赖具有特定标志的包,但不指定该依赖关系.这很快就会减少到无用的程度.
我可以创建一堆孤立实例包.这样做的好处是可以在build-depends部分中指定对这些实例的依赖性.它的主要缺点是在hackage中添加了大量额外的包,并且需要将它们作为单独的包维护.
我还可以做些什么?什么是正确的做法?
我有一些旧的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)