scala
-
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 ..
-
Pattern Match 조합 - Email 주소 예제scala/basic 2021. 7. 27. 17:49
문제 email 의 username 부분이 동일한 문자열로 2번 반복되면서 모두 대문자인지 여부를 확인할 수 있는 아래 함수를 작성하라 def userTwiceUpper(s: String): String // 호출 결과 예시 userTwiceUpper("DIDI@hotmail.com") // match: DI in domain hotmail.com userTwiceUpper("DIDO@hotmail.com") // no match userTwiceUpper("didi@hotmail.com") // no match Code "Programming in Scala" 책에 나오는 코드 object PatternMatchTest { object Email { def apply(user: String, domai..
-
enum 을 사용한 모델링scala/basic 2021. 7. 23. 23:20
문제 연령대를 계산해 주는 다음 함수를 작성하라 /** * age 값이 * - 0 이하면 "~0" 리턴 * - 1~9 값 이면 "1~9" 리턴 * - 10~59 값 이면 "10~59" 리턴 * - 60 이상이면 "60~" 리턴 */ def ageGroup(age: Int): String = ??? Code scala standard library 로 제공되는 enum 은 기능이 빈약하니 enumeratum 을 활용해 작성한다. import AgeGroup.{Elder, Interval, Invalid} import enumeratum._ import scala.collection.immutable sealed trait AgeGroup extends EnumEntry { self => override d..
-
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. 동..