scala/basic
-
Scala Closurescala/basic 2022. 10. 21. 19:56
코드 object ScalaApp { def runner(f: () => Int): Unit = { val out = f() println(out) } def sum(x: Int, y: Int): () => Int = { val inner = () => x + y inner } def main(args: Array[String]): Unit = { val f = sum(1, 2) runner(f) } } 설명 python 의 Closure 와 비교해 보자
-
java callback 을 scala Future 로 바꾸기scala/basic 2022. 7. 16. 18:57
문제 다음과 같이 java Async Http Client 의 callback 을 scala Future 로 변경해 코딩해 보자 val asyncHttpClient = org.asynchttpclient.Dsl.asyncHttpClient() val listenableFuture = asyncHttpClient.prepareGet("https://api.agify.io/?name=meelad").execute() val listener = new Runnable { override def run(): Unit = { val body: String = listenableFuture.get().getResponseBody(scala.io.Codec.UTF8.charSet) println(body) } } l..
-
sealed trait typeclassscala/basic 2022. 3. 29. 14:45
문제 sealed trait 대상으로 typeclass 를 정의할 때, 다음과 같은 문제가 있다. https://www.reddit.com/r/scala/comments/96woxd/how_to_implement_an_adt_that_all_members_have/ 코드 http://eed3si9n.com/herding-cats/typeclasses-102.html 참고 trait Eq[A] { def eqv(x: A, y: A): Boolean } object Eq { def apply[A](implicit eq: Eq[A]): Eq[A] = eq implicit class EqSyntax[A](x: A) { def ===(y: A)(implicit eq: Eq[A]): Boolean = eq.eqv(..
-
scala 에서 retry 구현하기scala/basic 2021. 11. 25. 18:11
문제 cats-effect 나 zio 등의 functional library 를 사용하면, 이미 구현되어 있는 retry 를 쉽게 사용할 수 있다. 혹은 retry library 를 활용할 수도 있다. 간단하게 쓸수 있도록 scala 표준 라이브러리만을 사용해 retry 를 구현해 보자. stackoverflow 를 참고할 수 있다. 코드 import scala.annotation.tailrec import scala.util.{Failure, Success, Try} object Util { @tailrec def retry[T](n: Int)(f: => T): Try[T] = if (n < 0) { Failure(new Exception(s"$n must be greater or equal to 0"..
-
scala enumeratum enum 사용하기scala/basic 2021. 11. 13. 23:20
enumeratum 을 사용해 보자 build.sbt 에 라이브러리를 추가한다. libraryDependencies ++= Seq( "com.beachape" %% "enumeratum" % "1.7.0", "com.beachape" %% "enumeratum-play-json" % "1.7.0" ) 간단한 경우 import enumeratum._ import play.api.libs.json.Json import scala.collection.immutable sealed abstract class Country extends EnumEntry object Country extends Enum[Country] with PlayJsonEnum[Country] { override def values: im..
-
Variance 문제scala/basic 2021. 10. 22. 21:30
scala 에서 이해하기 가장 어려운 부분 중 하나가 Variance 일 것이다. Variance 를 이해 했다면 다음 문제를 풀어보자. 문제1 아래와 같이 정의했을 때 trait Sum[+A, +B] { def flatMap[C](f: B => Sum[A, C]): Sum[A, C] = ??? } 다음과 같은 에러 메시지를 보게 될 것이다. error: covariant type A occurs in contravariant position in type B => Sum[A,C] of value f 이를 해결하려면 어디를 수정해야 할까? 아래와 같이 작성하면 된다. (Why?) trait Sum[+A, +B] { def flatMap[T >: A, C](f: B => Sum[T, C]): Sum[T, ..
-
apache poi 를 사용해 scala 에서 Excel 파일 읽기scala/basic 2021. 10. 14. 11:17
def main(args: Array[String]): Unit = { val rows = readSheet[MyModel]("c:/work/input.xlsx", "평가 항목", true) println(rows) } 문제 apache poi 를 사용해 Excel 파일을 읽어보자. apache poi 는 자바 라이브러리지만 스칼라 스타일로 코딩해 보도록 한다. 코드 일반적으로 사용할 수 있도록 아래처럼 Generic 한 util 을 작성한다. import org.apache.poi.openxml4j.opc.OPCPackage import org.apache.poi.ss.usermodel.{Row, Workbook} import org.apache.poi.xssf.usermodel.XSSFWorkbook..
-
Scala State Monadscala/basic 2021. 8. 3. 12:12
문제 State Monad 를 만들고, 이를 사용해 다음을 계산하라. 골프 공을 쳐서 처음에는 20m, 두번째는 10m, 세번째는 15m 를 보냈다. 그런데 시작라인에서 3m 를 더 나온 위치에 공을 두고 쳤다면 최종 골프공은 시작라인에서 어느정도 떨어져 있을까? 3 + 20 + 10 + 15 = 48 코드 case class State[S, A](run: S => (S, A)) { def flatMap[B](f: A => State[S, B]): State[S, B] = State { s0 => val (s, a) = run(s0) // 현재 상태의 run 을 적용하고 f(a).run(s) // 이후에 f 를 적용해 S => (S, A) 함수를 갱신함 } // 기존 run 과는 다른 새롭게 정의된 S ..