簡體   English   中英

Haskell中數據類型的設計

[英]Design of data types in Haskell

你有什么建議:

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

然后我正在制作:

data Move = WalkRight Bool | Jump

要么

data Move = Walk Direction | Jump

取決於之前的答案。 我有Char -> Maybe Move類型的功能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讓它更干凈?

我更喜歡這樣的東西:

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並沒有真正解釋它意味着什么...它是否意味着你有一個方向或者你沒有方向? 嗯! 另外,當你需要UpDown時會發生什么? 如果Direction只是一個Bool那么很難擴展你的程序。

Move在這里有一個數據構造函數Stationary ,實際上根本不是一個移動。 你“泄漏”一些按鍵不會導致移動的概念。 再次,這將最終使您的代碼復雜化。

說得通?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM