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