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让它变得更干净?
我更喜欢这样的东西:
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并没有真正解释它意味着什么......这是否意味着你有一个方向或者你没有方向?嗯!此外,会发生什么,当你需要Up和Down?如果Direction只是一个,很难扩展你的程序Bool.
并且这里Move有一个数据构造函数Stationary,实际上根本不是一个移动.你"泄漏"一些按键不会导致移动的概念.再次,这将最终使您的代码复杂化.
合理?
| 归档时间: |
|
| 查看次数: |
316 次 |
| 最近记录: |