Closed duckcalf closed 5 years ago
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)
}
형식에 대한 추상(abstracting over the type)을 배열과 배열 안의 한 요소를 검색하는 함수에 적용한 결과
def findFirst[A](as: Array[A], p: A => Boolean): Int = {
@annotation.tailrec
def loop(n: Int): Int =
if (n >= as.length) -1
else if (p(as(n))) n
else loop(n + 1)
loop(0)
}
val array = Array("1", "2", "3")
val key = "1"
def isContain(item: String): Boolean = {
item == key
}
val result = findFirst(array, isContain)
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)
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))
def partial1[A, B, C](a: A, f: (A, B) => C) : B => C
def partial1[A, B, C](a: A, f: (A, B) => C) : B => C =
(b: B) => f(a, b)
def curry[A, B, C](f:(A, B) => C): A => (B => C) =
(a: A) => (b: B) => f(a,b)
def uncurry[A, B, C](f: A=> B=> C) : (A, B) => C =
(a: A, b: B) => f(a)(b)
def compose[A, B, C](f: B => C, g: A=> B): A => C =
(a: A) => f(g(a))
2.1 스칼라 언어이 소개 : 에제 하나
object 키워드
def 키워드
val 키워드
main
Unit
2.2 프로그램의 실행
2.3 모듈, 객체, 이름공간
이름공간
모듈
표기법
2.4 고차 함수: 함수를 함수에 전달
고차 함수(higher-order function, HOF)
2.4.1 잠깐 곁가지: 함수적으로 루프 작성하기
꼬리 호출 : 재귀 호출의 결과를 그대로 돌려주는 것 외에는 아무 일도 하지 않은 호출
꼬리 호출 제거(tail call elimination)
연습문제 2.1
정답 : 01.answer.scala