전체 글 97

Scala로 풀어본 개미수열(읽고 말하기 수열)

개미수열은 꽤 유명하다. 111 (1이 1개)12 (1이 2개)1121 (1이 1개, 2가 1개)...이런 식으로 무한히 이어져 가는 수열인데 몇가지 방면에서 만들어볼만한 수열이라고 생각한다.Run-length encoding이라는 것과도 비슷하다. 1. 간단한 방법우리가 푸는 방법 그대로를 구현한다면 어떨까? 이전 단계의 수열을 입력받아 각 수를 세게 하는 방법이다. 수열을 리스트로 입력받는다고 했을 때, 리스트의 앞부분부터 숫자가 같으면 count를 증가시키고 다르면 숫자와 개수를 정답으로 붙이면 된다. /** * @param lst 현재 단계의 수열 * @param numb 현재 세고 있는 수 * @param count numb의 개수 * @return 다음 단계의 수열 */ def antLst1(..

Scala 2017.02.15

Scala에서의 map/flatmap, for

함수형 프로그래밍의 주요 함수 중 하나인 map은 n개의 요소 각각에 함수를 적용한 결과를 만들어내는 함수이다. 많은 문제를 접하다 보면 자연스레 for보다 map을 선호하게 되는데 문제에 따라 for문을 사용하는 것이 더 간결한 코드를 만들어 낼 수 있었다. 구구단의 예를 들어 보자. 원하는 결과가 1단부터 9단까지 결과의 리스트라고 하자. 이 때 flatMap함수를 사용한다면 이렇게 쓸 수 있다.val range = 1 to 9 val result = range.flatMap{i => range.flatMap{j => List(i * j) } } 1) 2의 배수 단의 결과만을 얻고 싶다고 해 보자.val result = range.filter(_ % 2 == 0).flatMap{i => range.f..

Scala 2017.02.11

Scala의 지연 콜렉션 Stream 기본 문법

1. 스트림끼리 연결Stream(1, 2) #::: Stream(3, 4) // Stream(1, 2, 3, 4) 2. 우측 스트림의 요소로 삽입100 #:: Stream(3, 4) // Stream(100, 3, 4) 3. 우측 스트림의 요소로 삽입 2 Stream.cons(Stream(1, 2), Stream(3, 4)) // Stream(Stream(1, 2), 3, 4) 4. 빈 스트림Stream.empty // 새로운 빈 스트림 Stream.Empty // 패턴 매칭 case문에서 사용 5. 시드값으로부터 일정 수만큼 더해져 나가는 스트림Stream.from(1, 2) // Stream(1, 3, 5, 7 ...) 6. 시드값으로부터 계산되어가는 스트림Stream.iterate(2)(s => s..

Scala 2017.02.10

Scala에서 꼬리재귀와 트램폴린, Stream

함수형 = 재귀함수는 아니지만 재귀함수를 많이 사용한다는 것은 틀림없을 것이다.하지만 컴퓨터 프로그램의 구조상 함수를 호출할 때마다 스택에 값들이 쌓여 StackOverFlow를 피할 수 없다. 이 친숙한 스택오버플로를 피하기 위한 방법들이 있다.꼬리재귀와 트램폴린, 지연 콜렉션 Stream이다. 사실 스트림은 스택오버플로를 피하기 위한 방법은 아니다.하지만 스택오버플로가 발생할 수 있는 문제에서 스트림을 사용, 더 이른 스택 복귀를 통해(혹은 다른 방법으로의 접근) 문제를 해결한 경험이 있어 함께 적어둔다. 1. 꼬리재귀(Tail Recursive)꼬리재귀는 어떤 함수가 자기 자신을 호출하되 그 호출이 함수의 마지막 연산인 경우를 말한다.꼬리재귀는 아주 쉽게 반복문으로 변경할 수 있다. 많은 함수형 프..

Scala 2017.02.09

SBT Jar Build

SBT로 JAR 파일을 만들기 위해서는 assembly라는 것이 필요하다. 링크 건 깃허브에 잘 되어 있지만... 1. project 폴더 안에 assembly.sbt 파일 생성 1addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3")cs 2. build.sbt 파일에 빌드 옵션 및 mainClass 설정 123scalacOptions ++= Seq("-unchecked", "-deprecation", "-Xcheckinit", "-encoding", "utf8") mainClass in assembly := Some("MainObject")Colored by Color Scriptercs 3. sbt console에서 'assembly' 명령 실행 -> 프..

Scala 2016.12.29

JavaFX with Scala?

자바FX는 fxml이나 어노테이션 덕분에 코드가 그렇게까지는 더러워지지 않지만 그래도 스칼라보다 많은 코딩을 요구할 수 밖에 없을 것 같다. 그래서 스칼라로 자바FX 어플리케이션을 만들어보고자 했다. 빌드 툴 SBT와 Gradle, 두가지 측면에서 생각해 보았는데 결론적으로 자바FX로 작은 용량의 어플리케이션을 작성할 예정이라면 스칼라를 사용하지 않는 것이 낫다. 용량 비교를 위해 그냥 버튼 하나 띄워져 있는 어플리케이션을 작성해 보았다. 1. Gradle, 자바FX 2. Gradle, 스칼라 컴파일러 디펜전시 추가해서 빌드 3. SBT, 스칼라 스칼라FX를 사용했을 경우. 메인 페이지의 Example을 사용한 것인데, FXML을 사용하기 위해서는 스칼라 매크로 디펜전시가 필요하다. 그 때는 용량이 더 ..

Scala 2016.12.29