假设我有一个Thing
带有 state 属性的类型A | B | C
,
并且合法的状态转换是A->B, A->C, C->A
.
我可以写:
transitionToA :: Thing -> Maybe Thing
如果处于无法转换Nothing
到.Thing
A
但我想定义我的类型和转换函数,以便只能在适当的类型上调用转换。
一种选择是创建单独的类型AThing BThing CThing
,但在复杂情况下似乎无法维护。
另一种方法是将每个状态编码为它自己的类型:
data A = A Thing
data B = B Thing
data C = C Thing
和
transitionCToA :: C Thing -> A Thing
这对我来说似乎更干净。但我突然想到,A、B、C 是函子,除了转换函数之外,所有的事物函数都可以被映射。
使用类型类,我可以创建如下内容:
class ToA t where
toA :: t -> A Thing
这似乎更清洁。
是否有其他可以在 Haskell 和 PureScript 中使用的首选方法?