Scala School/Basics 학습 메모

7497 단어 Scala

소개



아마 그물에있는 가장 우수한 Scala 교재 중 하나 일 것입니다 Scala School
신경이 쓰이는 일이나 시도한 것 등을 부분적으로 망비록으로서 메모해 두려고 생각합니다.
Scala School은 설명이 매우 깔끔하기 때문에 그 보충이 되면 좋을까라고 생각합니다.
Lessons별로 기사는 나눕니다. 우선 첫번째 lesson인 basics에서.

본편



Anonymous function



Listing 1
val a = (x:Int) => x + 1
a(5) //結果は6

val b = (x:Int,y:Int) => x + y //複数の引数ももちろんOK
c(5,6) //結果は11

val c = (x:Int)(y:Int) => x + y //NG.匿名関数でcurriedの形はできない

val d = (x:Int) => (y:Int) => x + y //どうしても匿名でcurriedの形で書きたい場合はこうする
d(3)(7) //結果は10

scala에서는 패턴 c의 쓰는 방법을 curried function으로 하고 있습니다만, 본래는 d의 쓰는 쪽이 클로저를 이용한 정통인 curried function일지도 모릅니다.
익명이 아닌 curried function에 대해서는 후술.

Partial application



Listing 2
def adder(m:Int,n:Int) = m + n //まず定義

val addTwo = adder(2, _:Int) //1.これで部分適用できる
val addTwo = adder(2, _)     //2.型指定を省略してもOK
val addTwo = adder(_, 2)     //3.最後の引数だけでなくどの引数でもワイルドカードにできる


※편의적으로 addTwo라는 같은 이름을 여러 번 사용하고 있습니다. val이므로 실제로는 에러가 됩니다.

Curried functions



Listing 3
def multiply(m:Int)(n:Int) = m * n //関数を定義

val timesTwo = multiply(2) _      //4.OK
val timesTwo = multiply(2)(_)     //5.OK
val timesTwo = multiply _(2)      //6.エラー
val timewTwo = multiply(_)(2)     //7.これもエラー
val timesTwo = multiply(_:Int)(2) //8.型指定を入れればOK

※ 편의적으로 timesTwo라는 같은 이름을 여러 번 (이하 약어

패턴 7은 missing parameter type이라는 오류가 발생하지만 이유를 잘 모르겠습니다.
stackoverflow에서 물어 보지만, 아직 답변 없음. (알고 계시면 부탁드립니다 )
scala의 버전에 따라 패턴 2. 또는 3.도 비슷한 오류가 발생합니다.

Variable length arguments



Listing 4
def capitalizeAll(args: String*) = {
  args.map { arg =>
    arg.capitalize
  }
}

개인적으로 조금 걸렸던이 코드. 사실 인수는 {}에서도 입력할 수 있는 것 같습니다.
실제
println{"asdf"}

이것도 움직입니다.
식 그 자체도, 오브젝트·값으로서 맞붙기 때문에 이렇게 되어 있는 것일지도 모르겠네요. 자바의 습성이라도? 라고 생각했습니다.

이 후 scala school/basics에서는 클래스나 트레이트의 설명에 들어갑니다만, 그 엔은 특별한 신경이 쓰이는 곳도 없었으므로 생략합니다.
(나중에 뭔가 회상하고 추가할지도 모릅니다만)

좋은 웹페이지 즐겨찾기