Home 함수형 프로그래밍 - 함수와 타입 - 1
Post
Cancel

함수형 프로그래밍 - 함수와 타입 - 1

함수와 타입

방향 잡기

  • 전역변수에 숨겨진 부수효과 찾아내기
  • 절차(Procedure)를 순수함 수로 바꾸기
  • RecordData와 함수 비교하기
  • 함수 합성(composition)
  • 함수와 타입, 집합
  • 타입을 만드는 함수, 제네릭(Generic)

실습 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
토마토: 7000원
오렌지: 15000원
사과: 10000원
*/

export let totalPrice = 0;
totalPrice += 7000;
totalPrice += 15000;
totalPrice += 10000;
// 오렌지가 2개인지, 사과가 3개인지 불분명
totalPrice += 30000;
// 사소한 오타로 인한 실수
totalPrice += 8000;
// 단위가 잘못됐다면 실수라는 것을 인지하기조차 어려움
totalPrice += 70000;
  • 명령형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 전역 변수라는 부수효과를 사용
// 예측하기 어려운 오류의 발생 가능성이 있음
export let totalPrice = 0;

export function addTomato() {
  // 부수효과
  totalPrice += 7000;
}

export function addOrange() {
  totalPrice += 15000;
}

export function addApple() {
  totalPrice += 10000;
}

export function list1() {
  // 토마토, 오렌지, 사과 한 상자
  addTomato();
  addOrange();
  addApple();
}

export function list2() {
  // 토마토 2상자
  addTomato();
  addTomato();
}

export function list3() {
  // addOrange 함수를 직접 100번 호출 하는 대신
  // 함수를 100번 호출 하도록 명령하는 코드를 작성
  // 오렌지 100상자
  for (let i = 0; i < 100; i++) {
    addOrange();
  }
}

export function main() {
  list3();
}

부수 효과 없이 작성

  • 전역 변수가 없기 때문에 호출 횟수에 영향 없음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*
토마토: 7000원
오렌지: 15000원
사과: 10000원
*/
export function priceOfTomato() {
  return 7000;
}

export function priceOfOrange() {
  return 15000;
}

export function priceOfApple() {
  return 10000;
}

export function list1() {
  // 토마토, 오렌지, 사과 한 상자
  return priceOfTomato() + priceOfOrange() + priceOfApple();
}

export function list2() {
  // 토마토 2상자
  return priceOfTomato() + priceOfTomato();
}

export function list3() {
  // 오렌지 100상자 구입은 오렌지 가격을 100번 더하는 것과 동일하기 때문에
  // 오렌지 가격 * 100 으로 계산 가능
  // 오렌지 100상자
  return priceOfOrange() * 100;
}

export function getTotalPrice() {
  return list2();
}

export function getPrice(name: string) {
  if (name === "tomato") {
    return 7000;
  } else if (name === "orange") {
    return 15000;
  } else if (name === "apple") {
    return 10000;
  }
}
// 함수를 데이터로 표현
export const priceOfFruit = {
  tomato: 7000,
  orange: 15000,
  apple: 10000,
};

// 대량의 데이터를 직접 입력하는 것은 어려움
export const isEven = {
  tomato: true, // 문자열이 짝수인지지
  orange: true,
  apple: false,
};

// 어떤 문자열이여도 가능(함수로 한번에)
export const isEvenFn = (str: string) => str.length % 2 === 0;
This post is licensed under CC BY 4.0 by the author.