Functional Programming - Higher-Order Functions

실은 우리는 이미 higher-order function 을 사용해 보았습니다. 여기서 higher-order function이 무엇인지 알아보겠습니다. A function is called higher-order if it takes a function as an argument or returns a function as a result. 함수를 매개변수로 받거나 또는 결과로 돌려주는 함수를 의미하는데요, 아래 예의 twice 도 함수를 매개변수로 받기때문에 higher-order function 이라고 이야기 할 수 있습니다. twice :: (a -> a) -> a -> a twice f x = f (f x) 또한, 여기서 눈에 보이는 점은 twice 가 (a -> a) 와 같이 괄호(parentheses)를 이용하여 함수를…

Keep reading

Functional Programming - Recursive Functions

Recursive Function Recursive라는 표현은 아마 모든 분들이 익숙하실 겁니다. (한국어로 재귀라고 합니다) 간단히 설명드려 함수를 다루는 기법하나로 함수 내부에서 그 함수를 다시 호출하는 것을 말하는데요. Functional Programming에서 가장 중요하게 생각하는 것이 여기서 tail call을 없애는 겁니다. Stack이 쌓이는 경우 때문인데, 다음 설명을 계속 보겠습니다. factorial :: Int -> Int factorial n = product [1..n] 위의 예제는 간단히 factorial을 product를 이용하여 구현한 것 입니다. 이 함수를 이용할 경우 다음의 과정을 거치게 될 것입니다. factorial 4 = product [1..4] = product [1,2,3,4] = 1*2*3*4 = 24 다음은 이 함수를…

Keep reading

Functional Programming - List

아마 이글을 보고 있는 모든 개발자들은 List와 같은 collection에 굉장히 친숙할 것입니다. 또한, 이런 collection을 다루는 while, for, foreach등 많은 API를 다뤄왔을 겁니다. 하지만, 수학자(mathematicians)들이 가장 좋아하는 collection type은 set입니다. 이런 set은 중복 element는 삭제되는 등 List와 다른 면이 있습니다. Haskell에서 List는 head와 tail등 하나하나 읽히는 특성을 이용할 수 있습니다. 실제 이러한 기능을 모방하여 Java 8에서는 List를 Stream이라고 부르기도 합니다. Set Comprehensions 그럼 수학에서 set을 정의(Comprehension)하는 예제를 보겠습니다. 위의 공식의 결과는 {1,4,9,16,25}입니다. 하지만 실제 Set을 이용항 구현하기에는 쉽지 않습니다. (index를 이용한…

Keep reading

Functional Programming - Functions

Conditional Expressions 다른 언어들과 마찬가지로 Haskell도 조건식이 존재합니다. 다만 statement가 아닌 expression을 이용합니다. abs :: Int -> Int abs n = if n >= 0 then n else -n 위의 예는 절대값을 만드는 간단한 function입니다. 아래와 같이 nested로 표현도 가능합니다. signum :: Int -> Int signum n = if n < 0 then -1 else if n == 0 then 0 else 1 (Haskell에서는 애매한(ambiguous) 경우를 제거하기 위해 else가 필수입니다.) Guarded Equations 위와 같은 조건식을 사용하는 것과 달리 guarded equation이라는 것을 이용하여 표현이 가능합니다. abs n | n >= 0 = n | otherwise = -n…

Keep reading

Functional Programming - Types and Classes

Haskell 의 많은 function들은 list를 인자로 받습니다. > head [1,2,3,4,5] 1 > tail [1,2,3,4,5] [2,3,4,5] > [1,2,3,4,5] !! 2 3 > drop 2 [1,2,3,4,5] [3,4,5] > length [1,2,3,4,5] 5 > sum [1,2,3,4,5] 15 > product [1,2,3,4,5] 120 > [1,2,3] ++ [4,5] [1,2,3,4,5] > reverse [1,2,3,4,5] [5,4,3,…

Keep reading