次の Haskell コードがあるとします。
data Option
= Help
| Opt1 Int Double String
-- more options would be here in a real case
handleOption :: Option -> IO ()
handleOption option = case option of
Help -> handleHelp
Opt1 n f s -> handleOpt1 n f s
handleHelp :: IO ()
handleHelp = print "help"
handleOpt1 :: Int -> Double -> String -> IO ()
handleOpt1 n f s = print (n, f, s)
上記のコードでは、データをきちんとまとめておくことができるという意味で、事前にオブジェクトを分解するのはもったいないように思えます。ここで、Opt1 の各部分を個別に渡すか、単一の個別のデータ型を作成してそれらを運ぶ必要があります。コンパイルエラーを起こすなど、一般的なインスタンスを渡すことを許可せずに全体を渡すことはOpt1
できますか?handleOpt1
Option
handleOpt1 Help
以下の疑似コードの例:
data Option
= Help
| Opt1 Int Double String
handleOption :: Option -> IO ()
handleOption option = case option of
Help -> handleHelp
opt1 @ Opt1{} -> handleOpt1 opt1
handleHelp :: IO ()
handleHelp = print "help"
handleOpt1 :: Option:Opt1 -> IO ()
handleOpt1 (Opt1 n f s) = print (n, f, s)