4

你有什么建议:

data Direction = Left | Right
type Direction = Bool
newtype Direction = Direction Bool

然后我正在制作:

data Move = WalkRight Bool | Jump

或者

data Move = Walk Direction | Jump

取决于前面的答案。我有一个类型的功能Char -> Maybe Move

charToAction 'q' = Just $ WalkRight False
charToAction 'd' = Just $ WalkRight True
charToAction 'z' = Just Jump
charToAction _ = Nothing

我应该将我的类型更改Move为:

data Move = Stationary | WalkRight Bool | Jump

? 该功能将变为:

charToAction 'q' = WalkRight False
charToAction 'd' = WalkRight True
charToAction 'z' = Jump
charToAction _ = Stationary

我想知道这是因为列表不需要Maybe:

data [a] = [] | a : [a]

或者有没有办法Maybe让它变得更干净?

4

1 回答 1

9

我更喜欢这样的东西:

data Direction = Left | Right
data Move = Walk Direction | Jump
type Action = Maybe Move
type ActionList = [Action]

charToAction :: Char -> Action
charToAction c = case c of
  'q' -> Just $ Walk Left
  'd' -> Just $ Walk Right
  'z' -> Just $ Jump
  _   -> Nothing

stringToActions :: String -> ActionList
stringToActions = map charToAction

根据每种数据类型清楚地解释其用途的原则,并且不“假设”任何关于如何使用它的信息。一些反例:

newtype Direction = Direction Bool
data Move = Stationary | Walk Direction | Jump

在这里,Direction并没有真正解释它的含义……它意味着您有方向还是没有方向?嗯!另外,当您需要Upand时会发生什么Down?如果Direction只是一个Bool.

并且这里Move有一个数据构造函数Stationary,它实际上根本不是一个移动。您“泄露”了某些击键不会导致移动的概念。同样,这最终会使您的代码复杂化。

有道理?

于 2012-06-24T17:17:26.173 回答