Action
をThing
に適用したい場合があります。値の種類に応じて異なる機能を実行
data Thing = BoxVal Box | BallVal Ball deriving (Show)
data Box = Box {name :: String} deriving (Show)
data Ball = Ball {size :: Int} deriving (Show)
data Action = SetName String | Resize Int | ToFoo deriving (Show)
applyAction :: Thing -> Action -> Maybe String
applyAction (BoxVal box) a = actionToBox box a
applyAction (BallVal ball) a = undefined
applyAction _ _ = Nothing
actionToBox :: Box -> Action -> Maybe String
actionToBox b (SetName s) = Just $ s
actionToBox b (ToFoo) = Just "foo"
actionToBox _ _ = Nothing
作品上記のコード(とは本当にエレガントではない)が、GHCiの約Pattern match(es) are overlapped
applyAction
で文句を言います。どのように警告を取得せずに同じ機能を取得するには?
あなたのコードは実際には 'Just'値しか生成しないので、' Maybe'を完全に削除して値を直接返すことができます。 – dfeuer
これはダミーコードです。サポートされていないアクションがある可能性がありますが、Maybeが必要です。 – Paradiesstaub
ハスケルでは、通常、このような事態を避けるためにできる限り多くのことを試しています。関数が 'Thing'を受け入れるならば、それはすべてのThing'sに作用するはずです。時にはこれができないことがあります。可能であれば、エラーを報告するために 'Maybe'などを使用します。それ以外の場合、無効な状態を表現することができなくなり、「アクション」が合計される(つまり、エラーが発生しない)ように、不要なケースを「存在」から削除することができます。最高の慣用的な解決策は、もちろん実際の作業に依存します。 – chi