Haskell中数据类型的设计

L01*_*man 4 haskell algebraic-data-types

你有什么建议:

data Direction = Left | Right
type Direction = Bool
newtype Direction = Direction Bool
Run Code Online (Sandbox Code Playgroud)

然后我正在制作:

data Move = WalkRight Bool | Jump
Run Code Online (Sandbox Code Playgroud)

要么

data Move = Walk Direction | Jump
Run Code Online (Sandbox Code Playgroud)

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

charToAction 'q' = Just $ WalkRight False
charToAction 'd' = Just $ WalkRight True
charToAction 'z' = Just Jump
charToAction _ = Nothing
Run Code Online (Sandbox Code Playgroud)

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

data Move = Stationary | WalkRight Bool | Jump
Run Code Online (Sandbox Code Playgroud)

?该功能将成为:

charToAction 'q' = WalkRight False
charToAction 'd' = WalkRight True
charToAction 'z' = Jump
charToAction _ = Stationary
Run Code Online (Sandbox Code Playgroud)

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

data [a] = [] | a : [a]
Run Code Online (Sandbox Code Playgroud)

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

mer*_*ict 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
Run Code Online (Sandbox Code Playgroud)

根据每种数据类型清楚地解释其自身目的的原则,并且不"假设"任何关于如何使用它的内容.一些反例:

newtype Direction = Direction Bool
data Move = Stationary | Walk Direction | Jump
Run Code Online (Sandbox Code Playgroud)

在这里,Direction并没有真正解释它意味着什么......这是否意味着你有一个方向或者你没有方向?嗯!此外,会发生什么,当你需要UpDown?如果Direction只是一个,很难扩展你的程序Bool.

并且这里Move有一个数据构造函数Stationary,实际上根本不是一个移动.你"泄漏"一些按键不会导致移动的概念.再次,这将最终使您的代码复杂化.

合理?

  • 我不确定`ActionList`是一个很好的类型.真的,它只是说"[动作]",毕竟,字面意思是"动作列表"!在这种情况下,`[Action]`也更容易阅读.现在,如果你的类型具有更具体的角色,而不仅仅是一个动作列表,比如可能采取的行动列表,那么我肯定会看到类似`type ActionChoices = [Action]`的情况.类型同义词仅适用于向程序员提供附加信息,"ActionList"不执行此操作. (2认同)