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それが何を意味するのかをあまり説明していません... 方向があるということですか、それとも方向がないということですか? うーん!また、必要な場合はどうUpなりDownますか?Directionが単なるBool.

ここには、実際にはまったく移動しないMoveデータ コンストラクターがあります。Stationary一部のキーストロークでは移動しないという概念を「漏らします」。繰り返しますが、コードが複雑になります。

わかる?

于 2012-06-24T17:17:26.173 に答える