在处理一些内部状态时,我经常在设计数据类型时遇到问题。假设我有以下定义:
data Action a b c = Action { on :: a -> (c, b); off :: b -> a -> c }
读取:一个动作,可以打开或关闭(需要 a 类型的值,产生一些 c 类型的值)。为了关闭它,需要一个类型为 b 的特殊数据,该数据由先前的on
调用给出。
现在我设计了一个动作来跟踪它是打开还是关闭:
data StatefulAction a b c = Off (Action a b c) | On b (Action a b c)
但是我也可以使用这个:
data State b = Off | On b -- or type State b = Maybe b
data StatefulAction a b c = SA (Action a b c) (State b)
哪一个更可取?