【问题标题】:Design of Datatypes: implicit or explicit State数据类型的设计:隐式或显式状态
【发布时间】: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


【解决方案1】:

从语义上讲,它是完全相同的。

在语法上,我想您应该选择使代码更具可读性的内容。您也可以为此使用type 同义词。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2013-08-27
    • 2017-09-10
    相关资源
    最近更新 更多