scala
-
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(..
-
scalatest-3.0.5 에서 scalacheck 의 generator 사용하기scala/scalatest 2022. 2. 19. 19:52
문제 scalatest 내에서 scalacheck 의 generator 를 사용해 보자. 아래 Person 인스턴스를 생성해 주는 generator 를 만들어 보자 case class Person(name: String, age: Int, isAdult: Boolean, gender: String, isMarried: Boolean) 코드 build.sbt 에 scalatest, scalacheck 라이브러리를 추가한다. libraryDependencies ++= Seq( "org.scalatest" %% "scalatest" % "3.0.5" % "test", "org.scalacheck" %% "scalacheck" % "1.13.5" % "test" ) Generator 와 테스트를 작성한다. pe..
-
scala 에서 retry 구현하기scala/basic 2021. 11. 25. 18:11
문제cats-effect 나 zio 등의 functional library 를 사용하면, 이미 구현되어 있는 retry 를 쉽게 사용할 수 있다. 혹은 retry library 를 활용할 수도 있다. 간단하게 쓸수 있도록 scala 표준 라이브러리만을 사용해 retry 를 구현해 보자. stackoverflow 를 참고할 수 있다. 코드import scala.annotation.tailrecimport scala.util.{Failure, Success, Try}object Util { @tailrec def retry[T](n: Int)(f: => T): Try[T] = if (n Success(value) case Failure(_) => if (n == 1) Try(f..
-
scalatest-3.0.5 의 property based testscala/scalatest 2021. 11. 14. 18:45
문제 정수 n 에 대해 n 의 마지막 자리수를 구하는 함수 n 이 5 의 배수인지를 체크하는 함수를 구현했다. object Calculator { def lastDigit(n: Int): Int = math.abs(n) % 10 def isDivisibleByFive(n: Int): Boolean = n % 5 == 0 } 잘 구현되었는지 체크를 위해 scalatest property based test 를 작성하자 특히, n 이 5의 배수일 경우 n 의 마지막 자리수가 0 또는 5 임을 체크하도록 하자. 코드 build.sbt 에 scalatest, scalacheck 라이브러리를 추가한다. libraryDependencies ++= Seq( "org.scalatest" %% "scalatest" % ..
-
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 ..