Burt.K

코코아를 좋아하는 프로그래머입니다 ;)

함수를 정의하자.

수학적 함수표기와 Haskell 함수표기의 차이점

Mathematics Haskell
f(x) f x
f(x,y) f x y
f(g(x)) f (g x)
f(x,g(y)) f x (g y)
f(x)g(y) f x * g y

조건 표현식으로 함수 정의하기

abs :: Int -> Int
abs n = if n >= 0 then n else -n

조건 표현식 중첩하기

signum :: Int -> Int
signum n = if n < 0 then -1 else
            if n == 0 then 0 else 1

주의 Haskell에서 if 조건 표현식은 항상 else 문이 있어야 한다.

Guard를 사용하여 함수 정의하기

abs n | n >= 0    = n
      | otherwise = -n
signum n | n < 0     = -1
         | n == 0    = 0
         | otherwise = 1

아주 깔끔하다.

패턴매칭을 사용하여 함수 정의하기

not :: Bool -> Bool
not False = True
not True  = False
(&&) :: Bool -> Bool -> Bool
True  && True       = True
True  && False      = False
False && True       = False
False && False      = False

좀 더 간단하게

(&&) :: Bool -> Bool -> Bool
True && True = True
_    && _    = False

좀 더 성능 좋게, 첫번째 인자를 평가해서 False이면 두 번째 인자를 평가하지 않기 때문이다.

(&&) :: Bool -> Bool -> Bool
True  && b = b
False && _ = False

함수 정의에 나타나는 리스트 패턴

head :: [a] -> a
head (x:_) = x

 * 리스트를 받아 첫 요소를 반환하는 함수
tail :: [a] -> a
tail (_::xs) = xs

 * 리스트를 받아 첫요소를 제외한 나머지 목록을 반환하는 함수
← 타입을 읽자.
대수적 데이터 타입과 Enum →