【发布时间】:2012-09-26 10:13:46
【问题描述】:
我在处理一些内部状态时经常遇到设计数据类型的问题。假设我有以下定义:
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)
哪个更好?
【问题讨论】:
-
为什么不使用 State Monad,将 b 包裹在一个 state 中?
-
为什么不
data Action a b c = Off {on :: a -> (c,b)} | On {off :: b -> a -> c; bVal :: b} -
@Satvik 因为 b 不是状态,它是每个动作唯一的一段数据。 State Monad 只会增加不必要的复杂性。 @is7s 我需要一些像
switch :: Action a b c -> a -> (c, Action a b c)这样的功能。这是不可能的,考虑switch (Off on) a = let (c, b) = on a in On ??? b
标签: haskell types abstract-data-type