【发布时间】:2013-07-24 19:52:58
【问题描述】:
所以,我非常了解代数类型和类型类,但我对它的软件工程/最佳实践方面很感兴趣。
关于类型类的现代共识是什么?他们是邪恶的吗?它们方便吗?应该使用它们,何时使用?
这是我的案例研究。我正在写一个 RTS 风格的游戏,我有不同种类的“单位”(坦克、侦察兵等)。假设我想获得每个单位的最大生命值。我对如何定义它们的类型的两个想法如下:
ADT 的不同构造函数:
data Unit = Scout ... | Tank ...
maxHealth :: Unit -> Int
maxHealth Scout = 10
maxHealth Tank = 20
Unit的Typeclass,每一种都是一个实例
class Unit a where
maxHealth :: a -> Int
instance Unit Scout where
maxHealth scout = 10
instance Unit Tank where
maxHealth tank = 20
显然,最终产品中将会有更多的领域和功能。 (例如,每个单元都有不同的位置等,因此并非所有功能都是恒定的)。
诀窍是,可能有一些函数对某些单元有意义,但对其他单元没有意义。例如,每个单位都会有一个 getPosition 函数,但坦克可能有一个 getArmour 函数,这对于没有盔甲的侦察兵来说没有意义。
如果我希望其他 Haskeller 能够理解并遵循我的代码,那么“普遍接受”的编写方式是什么?
【问题讨论】:
-
我明白你的要求,但作为旁注,你上面的代码是不合法的,不会编译。 Scout 和 Tank 是同一类型 Unit 的不同构造函数 - 您不能为每个 constructor 定义单独的实例。您打算使用 DataKinds 扩展吗?
-
你也可以阅读我对类似问题的回答here。
标签: haskell types functional-programming typeclass