Scala
-
1.7 꼬리 재귀scala/functional programming 2024. 4. 4. 20:53
tail recursion: If a function calls itself as its last action, the function's stack frame can be reused. Exercise factorial() 을 꼬리재귀 버전으로 구현하라. import scala.annotation.tailrec def factorial(n: Long): Long = { @tailrec def fact(n: Long, acc: Long): Long = if (n == 0) acc else fact(n - 1, n * acc) fact(n, 1) } @main def Main(): Unit = { val r = factorial(10) println(r) }
-
1.6 블록과 어휘 범위scala/functional programming 2024. 4. 4. 19:58
예제: 뉴턴의 방법 의 코드 문제는 너무 많은 function 이 있다는 점이다. sqrt() function 안으로 관련 코드를 넣고, 기존에 중복으로 사용된 x 값을 조정하면 아래처럼 개선할 수 있다. def abs(x: Double): Double = if x > 0 then x else -x def sqrt(x: Double): Double = { def isGoodEnough(guess: Double): Boolean = abs(guess * guess - x) < 0.001 def improve(guess: Double): Double = (guess + x / guess) / 2 def sqrtIter(guess: Double): Double = if isGoodEnough(guess) th..
-
1.5 예제: 뉴턴의 방법을 사용한 제곱근scala/functional programming 2024. 4. 4. 19:48
뉴턴의 방법 알고리즘 sqrt(x) = y 를 구하기 위해 1. 초기 예측값 선정 (y=1 로 선택) 2. 다음 예측값 = mean(y, x/y) 을 반복하다 보면 점점 정확해 짐 예제 sqrt(2) 를 계산해 보자. EstimationQuotientMean Estimation Quotient Mean 1 2 / 1 1.5 1.5 2 / 1.5 = 1.333 1.4167 1.4167 2 / 1.4167 1.4142 1.4142 ... ... 코드 def abs(x: Double): Double = if x > 0 then x else -x def isGoodEnough(x: Double, guess: Double): Boolean = abs(guess * guess - x) < 0.001 def impr..
-
1.4 조건과 값 정의scala/functional programming 2024. 4. 4. 19:47
Short circuit evaluation 표현식을 평가하지 않아도 결과를 알 수 있는 것을 단락평가(short circuit evaluation) 이라고 한다. 다음 예를 보자. false && e // false (e 의 평가와 관계 없이) true || e // true (e의 평과와 관계 없이) Value definitions def loop: Boolean = loop val x = loop // infinite loop def x = loop // OK 다음 function 을 if 를 사용해 구현해 보자. and(x, y) == x && y call by value 구현 def and(x: Boolean, y: Boolean): Boolean = if x then y else false d..
-
1.3 평가 전략 및 종료scala/functional programming 2024. 4. 4. 19:47
평가(Evaluation) 종료 call by value 로 expression 이 종료되면, call by name 으로도 expression 이 종료된다. 그러나 call by name 으로 expression 이 종료된다고 해서, 항상 call by value 로 expression 이 종료되는 것은 아니다. 다음 예를 살펴보자 def loop: Int = loop def first(x: Int, y: Int) = x call by value first(1, loop) x=1 과 loop 가 evaluation 되어 expression 이 종료되지 않는다. call by name first(1, loop) x=1 만 evaluation 되어 (loop 는 evaluation 되지 않고) expres..
-
1.2 프로그래밍의 요소scala/functional programming 2024. 4. 4. 19:47
치환 모델 (substitution model) substitution model: evaluation 을 통해 expression 을 value 로 reduce 하는 과정 그러면 모든 expression 은 value 로 reduce 될 수 있을까? 다음 예를 보면 아니라는 것을 알 수 있다. def loop: Int = loop loop Call by value vs Call by name def test(x:Int, y:Int) = x * x 위의 코드에서 call by name 과 call by value 중 어느것이 더 유리할까? 연산 횟수를 비교해 보자 code #steps of call by value #steps of call by value test(2,3) 1번 1번 test(3+4, ..
-
typeclass 는 언제 사용하면 좋을까?scala/basic 2021. 6. 9. 10:44
https://w.pitula.me/2017/typeclasses-vs-polymorphism/ Typeclass: when inheritance is not enough If you ask Wikipedia about polymorphism, it will tell you that it is about “provisioning a single interface to entities of different types”. And this is true(remember that interface here and in whole post means API, not some element that is part of the w.pitula.me 1. 기존 class 에 새로운 method 를 추가할 때 2. 동..