パターンマッチ

ghcコマンドの場合-Wオプションでパターンマッチで実行時エラーが起きる場合に警告してくれるそうです。

変数パターン、「_」パターン、リテラルパターン、タプルパターン、リストパターン、データコンストラクタパターン、「@」パターンについての説明を読みました。

タプルパターンはid:MAS3:20070907#c1189118775で教えていただいたものですね。

ガードはid:MAS3:20070820#p1のところでパターンマッチで条件式が書ければすごくすっきり書けますねとかいた物が実現できます。

こんなのを書いていました。10の部分はgetArgsを使ってコマンドラインパラメータから取りたかったのですが、文字列を数値に変換する方法が分からなくて断念。基本的なことができないです。

main = do print $ fact 10

fact :: Int -> Int
fact n
  | n < 0     = n * fact(n+1)
  | n == 0    = 1
  | otherwise = n * fact(n-1)

以下のように10の所を-9にしたらエラーになってしまいました。

main = do print $ fact -9

fact :: Int -> Int
fact n
  | n < 0     = n * fact(n+1)
  | n == 0    = 1
  | otherwise = n * fact(n-1)

以下のように修正。

main = do print $ fact $ -9

fact :: Int -> Int
fact n
  | n < 0     = n * fact(n+1)
  | n == 0    = 1
  | otherwise = n * fact(n-1)

マイナスが駄目ならプラスも駄目だろうなと書いたらやっぱりエラー。

main = do print $ fact +9

fact :: Int -> Int
fact n
  | n < 0     = n * fact(n+1)
  | n == 0    = 1
  | otherwise = n * fact(n-1)