김동형수 개발기

Grokking Functional Programming - 2부 5장 본문

책 스터디/[완료] FP - Grokking Funtional Programming

Grokking Functional Programming - 2부 5장

김동형수 2022. 12. 14. 22:28

이 장에서는 다음을 수행하는 방법을 배웁니다.

  • flatten 을 사용하여 목록 목록 처리
  • for 루프 대신 flatMap 을 사용하여 순차 프로그램 작성
  • for comprehension을 사용하여 읽기 쉬운 방식으로 순차 프로그램 작성
  • 이해를 위해 내부 조건 사용
  • flatMap 이 있는 더 많은 유형에 대해 알아 보십시오.

책 객체 2차원 List에서 저자의 이름을 뽑으려면?

명령형 -> 3중첩 for loop 사용

함수형 -> 파이프라인 구성

 

flatten(scala에선 flatMap)함수를 이용해서 2차원 List를 1차원 List로 변환할 수 있다.

 

flatMap 은 목록의 유형을 변경할 수 있을 뿐만 아니라(예: Book 에서 String 으로) 결과 목록의 크기 도 변경할 수 있으며 이는 map 에서는 불가능합니다.

 

map으로는 매핑 함수의 본문 내부에서 저자나 책에 액세스할 수 없습니다.

좀 더 공식적으로, 우리의 flatMaps 는 서로 연결 되어 있으며, 이는 그 내부의 기능이 단일 요소에만 액세스할 수 있음을 의미합니다.

 

flatmap chaning과 flatmaps(중첩)

 

중첩은 코드의 가독성을 떨어트린다. 그 대안 for comprehension

 

list comprehension map, flatmap, filter의 대체로 사용된다.

 

명령문 은 유용하기 위해 프로그램의 상태를 변경해야 하는 언어 구조

 

명령문의 예는 for , while 및 even if

 

결과 컨테이너 유형은 열거자 유형에 의해 정의되고 해당 요소의 유형은 yield 뒤의 표현식에 의해 정의됩니다 .

가드 표현식 사용

for {
  r     <- radiuses
  point <- points
  if isInside(point, r)
} yield s"$point is within a radius of $r"
List("Point(1,1) is within a radius of 2")

 

map , foldLeft  flatMap

List[A].map(f: A => B): 목록[B]

f 로 전달된 함수 를 원래 목록의 각 요소에 적용하여 요소가 수정된 새 목록을 생성합니다. 데이터 구조( List )의 모양, 크기 및 요소 순서가 유지됩니다.

 

List[A].foldLeft(z: B)(f: (B, A) => B): B

원래 목록의 각 요소( A )와 현재 누산기 값( B )에 f 로 전달된 함수를 적용하여 B 유형의 값을 누적합니다 . 데이터 구조( List )의 모양과 요소의 크기 및 순서가 손실됩니다. B 유형의 값은 하나만 반환됩니다.

 

List[A].flatMap(f: A => List[B]): List[B]

원래 목록의 각 요소에 f 로 전달된 함수를 적용하여 원래 요소와 동일한 순서로 결합된 여러 목록(각 요소당 하나씩)을 생성합니다. 데이터 구조( List )의 모양은 유지되지만 크기는 다를 수 있습니다. 즉, 빈 목록이거나 원래 목록보다 몇 배 더 큰 목록일 수 있습니다.

 

 

Comments