【发布时间】:2020-02-24 07:08:30
【问题描述】:
我正在尝试减少 Copilot 中的样板数量。
在最近的版本中,我们添加了结构,使用它们需要声明两个实例。来自Copilot's repo 的示例如下。
对于数据类型:
data TestStruct = TestStruct
{ i :: Field "i" Int8
}
我们需要实例:
instance Struct TestStruct where
typename _ = "teststruct"
toValues t = [ Value Int8 (i t) ]
instance Typed TestStruct where
typeOf = Struct (TestStruct { i = Field 0 })
我想通过自动生成实例来使其更易于使用。
我一直在研究泛型,之前也使用过 Template Haskell,但过去几年情况发生了很大变化。许多软件包和推荐的解决方案现在已经过时了,我需要几个月的时间来浏览过去 10 年的论文和图书馆,后来才发现它们不再使用了。我无法理解编译器已经可以自动执行的操作、我应该使用哪些泛型扩展或包(如果有的话),并且通常无法找到一种有效且将继续有效的最新方法。
自动为这些类生成实例的最佳方法是什么? (如果可能,我想避免使用 TH,但我知道从今天起可能无法实现。)
【问题讨论】:
-
我没有时间将其详细说明为完整的答案,但我通常在这里使用的技术是使用
default方法编写Struct和Typed@ 987654327@,允许使用DeriveGeneric+DeriveAnyClass写入deriving (Generic, Struct, Typed)(或deriving stock (Generic)+deriving anyclass (Struct, Typed)显式DerivingStrategies)
标签: haskell generic-programming