NMP-Study / FunctionalProgrammingInScala

2 stars 0 forks source link

[함수형 프로그래밍] Chapter2.스칼라로 함수형 프로그래밍 시작하기 #9

Closed duckcalf closed 5 years ago

fairsun commented 5 years ago

2.1 스칼라 언어이 소개 : 에제 하나

object MyModule {
  def abs(n: Int): Int =
    if (n < 0) -n
    else n

  private def formatAbs(x: Int) = {
    val msg = "the absolute value of %d id %d"
    msg.format(x, abs(x))
  }

  def main(args: Array[String]): Unit =
    println(formatAbs(-42))
}

object 키워드

def 키워드

val 키워드

main

Unit

2.2 프로그램의 실행

2.3 모듈, 객체, 이름공간

이름공간

모듈

표기법

2.4 고차 함수: 함수를 함수에 전달

고차 함수(higher-order function, HOF)

2.4.1 잠깐 곁가지: 함수적으로 루프 작성하기

꼬리 호출 제거(tail call elimination)

연습문제 2.1

fairsun commented 5 years ago

2.5 다형적 함수: 형식에 대한 추상

단형적 함수(monomorphic fuction)

다형적 함수(polymorphic function)

2.5.1 다형적 함수의 예

배열에서 문자열을 찾는 단형적 함수

  def findFirst(ss: Array[String], key: String): Int = {
    @annotation.tailrec
    def loop(n: Int): Int =
      if (n >= ss.length) -1
      else if (ss(n) == key) n
      else loop(n + 1)

    loop(0)
  }

배열에서 한 요소를 찾는 다형적 함수

연습문제 2.2

  def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean = {
    @annotation.tailrec
    def go(n: Int): Boolean =
      if (n >= as.length - 1) true
      else if (ordered(as(n), as(n + 1))) false
      else go(n + 1)

    go(0)
  }

  val array = Array(1, 2, 3, 4)
  def ordered(a: Int, b: Int): Boolean = {
    if (a <= b) false
    else true
  }

  val result = isSorted(array, ordered)
  println(result)

2.5.2 익명 함수로 고차 함수 호출

findFirst(Array(7,9,13), (x: Int) => x == 9)
scala> (x: Int, y: Int) => x == y
res1: (Int, Int) => Boolean = $$Lambda$832/0x0000000801640840@2404b5a

scala> (x: Int, y: Int) => x < y
res2: (Int, Int) => Boolean = $$Lambda$833/0x0000000801641840@55acec99

스칼라에서 값으로서의 함수

함수 리터럴을 정의할 때 실제로 정의되는 것은 apply 라는 메서드를 가진 하나의 객체 "함수는 일급(first-class)값이다" => 일급 함수 => 함수 https://www.scala-lang.org/api/current/scala/Function2.html


val lessThan = new Function2[Int, Int, Boolean] {
def apply(a: Int, b: Int) = a < b

} println(lessThan(10, 20))

2.6 형식에서 도출된 구현

부분 적용(partial application)

def partial1[A, B, C](a: A, f: (A, B) => C) : B => C =
    (b: B) => f(a, b)

연습문제 2.3

함수 합성