所以,我非常了解代数类型和类型类,但我对它的软件工程/最佳实践方面很感兴趣。
如果有的话,关于类型类的现代共识是什么?他们是邪恶的吗?它们方便吗?应该使用它们,何时使用?
这是我的案例研究。我正在编写一个 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 能够理解并遵循我的代码,那么“普遍接受”的方式是什么?