当有许多数据类型具有几乎相同的结构时,如何在没有几乎重复的代码的情况下实现?
这是解释目标的无法编译的代码示例。
{-# LANGUAGE DuplicateRecordFields #-}
class Category a where
method :: a -> String
class ForB b where
...
class ForC c where
...
data A = A {someA :: String, ...}
data B1 = B1 {some :: Int, ...}
data B2 = B2 {some :: Int, ...}
...
data C1 = C1 {some :: Int, ...}
data C2 = C2 {some :: Int, ...}
...
instance Category A where
method (A x) = x
-- Cannot be compiled, but I want to write like this.
instance Category a where
method = show . some
instance ForB B1 where
....
instance ForC C1 where
....
main = do
let a = A "1"
b = B1 2
c = C1 3
print . method $ a
print . method $ b
print . method $ c
我理解instance
不会将类型变量a
视为instance Something a
,而只采用实际数据类型;没有多态实例吗?
我试图通过引入像this这样的新类来解决这个问题,但是无法解决这个问题。
我关注幻像类型或类型系列,但我找不到任何解决方案。
我不想为每种数据类型实现几乎相同的代码。 请在背景中参考更好的解释和样本。
有没有办法在不减少数据类型或模板Haskell(镜头,记录,扩展包)的情况下实现多态(?)实例。
我正在准备一系列示例代码,用于从OOP过渡到功能方法。
Here是解释的简化基本代码。
DuplicateRecordFields
对LifeInfo
的改善不大
你可以看到有大量的实例工具。
(请不要问我为什么不在数据类型中合并AnimalInfo
,Human
和Human
。这是解决一系列问题的系列之一)
但是,为了实现Elf
,Pine
,Rose
和LifeInfo
,我为每个实例编写了几乎相同的实例。 AnimalInfo
,PlantInfo
和A
还有一些例外情况。
B
等数据构造函数将条目数据类型(C
,data ABC = A {..} | B {..} | C {..}
和ForB
)组合到数据类型中。ForC
和pip install --upgrade django
类。