为Haskell实现简写实例

时间:2016-11-16 02:31:18

标签: class haskell polymorphism instance

当有许多数据类型具有几乎相同的结构时,如何在没有几乎重复的代码的情况下实现?

这是解释目标的无法编译的代码示例。

{-# 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是解释的简化基本代码。 DuplicateRecordFieldsLifeInfo的改善不大 你可以看到有大量的实例工具。 (请不要问我为什么不在数据类型中合并AnimalInfoHumanHuman。这是解决一系列问题的系列之一)
但是,为了实现ElfPineRoseLifeInfo,我为每个实例编写了几乎相同的实例。 AnimalInfoPlantInfoA还有一些例外情况。

一些要点

  • 请勿使用B等数据构造函数将条目数据类型(Cdata ABC = A {..} | B {..} | C {..}ForB)组合到数据类型中。
    但是当你可以通过类型检查引入一种区分它们的方法或者像事物一样实现类方法时,它会很好。
    请注意,有ForCpip install --upgrade django类。
  • 我正在避免模板Haskell和库使用TH来解决这个问题。

0 个答案:

没有答案