Programer/iOS

[FP] Functional Programing 용어 정리

아즈샤 2018. 7. 10. 15:43
반응형

1. Immutable Data

let foo = "bar"

한번 데이터를 넣으면 그 데이터를 바꾸지 마라.

(= 새로운 데이터를 사용하고 싶으면 새로 선언해서 사용해라)


2. Pure Function

함수 밖에 있는 변수를 바꾸지 말고, 안에서 변수를 만들어서 사용해라.

(같은 Input 에서 같은 Output을 내보내는 것)


3. Fuction as First-Class Citizen

Function을 일급 객체로 사용해라 (Swift에서 지원)


4. Lazy Evaluation

func heavyJob() -> String {    

return "This is heavy job"    

}    

func Log(_ mesage: String) {

#if DEBUG

print(message)

#endif

}

func Log(_ mesage: () -> String) {

#if DEBUG

print(message())

#endif

}

Log(heavyJob())            // 릴리즈 버전에서도 heavyJob() 를 일단 실행 후 작동

LazyLog(heavyJob)       // 릴리즈 버전에서도 매개변수로 함수가 전달되기 때문에 작동하지 않음


위 예제와 같이 함수의 실행을 Lazy하게 실행시켜 효율적으로 개발이 가능하다.


5. High-Order Function

다른 함수를 전달인자로 받거나 함수 실행 결과를 함수로 리턴하는 함수 (ex: Filter, Reduce, Map)


6. Recursing

효율을 높이기 위해 재귀 함수를 사용한다.

특히 재귀를 맨 끝에 구현하는 경우 : 꼬리 재귀 -> Swift는 컴파일러가 최적화를 지원한다.


7. Currying

함수를 리턴하는, 함수를 리턴하는, 함수를 리턴하는 함수

(이해가 잘 안되는데.. 따로 알아봐야 할듯)


그래서 FP가 무엇인가..?

Function No Side-Effect Declarative Programing

함수를 이용해서 사이드 이펙트 없이 선언형 프로그래밍을 하는 것

-> No Side Effect가 KEY


//non-FP : 오브젝트가 가지고 있는 메소드를 사용

account.deposit()

user.login()

// FP : 함수를 사용하여 데이터를 넣어줌

deposit(acoount)

user(User)


No Side-Effect

OOP - 오브젝트의 연관 관계로 만들어짐 - 모듈 (State / Method() )

FP - 순수함수는 인풋 들을 아웃풋이 서로 연결되어서 큰 아웃풋을 만들어 낸다. - 모듈(함수) (State가 없다) 

결국은 State가 있냐 없느냐의 차이가 OPP와 FP의 차이이다.


Imperative vs Declarative (HOW vs What)

나는 어떤 결과를 얻고 싶어! vs 나는 어떤 결과를 얻을 거야!

// Imperative
var i = 1;
while i <= 100 {
if i % 3 == 0, i % 5 == 0 {
print("fizzbuzz")
} else if i % 3 == 0 {
print("fizz")
} else if i % 5 == 0 {
print("buzz")
} else {
print("\(i)")
}
}

//Declarative

let fizz: (Int) -> String = { i in i % 3 == 0 ? "fizz" : "" }

let buzz: (Int) -> String = { i in i % 5 == 0 ? "buzz" : ""}

let fizzbuzz = { i in { $0.isEmpty ? "\(i)": $0}(fizz(i) + buzz(i)) }

let output  = { print($0) }

(1...100).map(fizzbuzz).forEach(output)


위 예제는 단계를 거쳐 좀 더 깔끔한 선언형 프로그래밍 방식으로 변형할 수 있는데 분량이 많아 아래 포스팅에서 집중적으로 작성하였습니다.

http://azsha.tistory.com/101?category=743068


참고링크

https://iosdevkor.github.io/let_us_go_2018_spring_review/ 에서 "곰튀김님의 Functinal Programing이 뭐하는 건가요?"



반응형