Haskell入門(関数の定義)

パターンマッチ

factorial :: Int -> Int
factorial 0 = 1
factorial n = n * factorial (n - 1)
*Main> factorial 0
1
*Main> factorial 1
1
*Main> factorial 2
2
*Main> factorial 5
120
firstLetter :: String -> String
firstLetter "" = "empty"
firstLetter all@(x:xs) = all ++ "," ++ [x]
*Main> firstLetter "abc"
"abc,a"
*Main> firstLetter ""
"empty"

ガード(場合分け)

-- 2つの引数のうち大きいものを返す
max' :: (Ord a) => a -> a -> a
max' a b
  | a > b = a
  | otherwise = b
*Main> max' 1 2
2
*Main> max' 1 1
1
*Main> max' 3 1
3
*Main> max' "ab" "ac"
"ac"

let(関数の中で変数を定義する)

-- 半径rの円の面積を求める
circle_area :: Double -> Double
circle_area r =
  let pi = 3.14
  in pi * r * r
*Main> circle_area 1
3.14
*Main> circle_area 2
12.56

where(関数の中で変数を定義する)

-- 半径rの円の面積を求める(whereを使う)
circle_area2 :: Double -> Double
circle_area2 r = pi * r * r
  where pi = 3.14

letによる局所的な関数定義

*Main> [let square x = x * x in (square 1, square 2)]
[(1,4)]

letとパターンマッチによるタプルの分解

*Main> let (a, b) = (1, 2) in a + b
3