あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

Stream

Listとほぼ同じで、違いは実際に要素が指定されるまで作成が遅延される。 要素が無限に続くリストや要素数を事前に決められないリストとして表現できる。Stream.cons は List の :: と同じように 先頭要素とリスト(Stream)を連結する。 cons は Streamコンパ…

遅延評価

名前渡し引数(by-name parameter) 名前渡し引数は、メソッド内で引数の名前が実際に使用される時に評価される。 引数が複数回参照される場合は、参照される度に評価される。 引数の型の前に => を付ける。(引数名: => 型) Scala は通常は、値渡し(関数を呼び…

デフォルト引数、名前付き引数

デフォルト引数 関数、メソッドの定義で引数にデフォルト値を指定できる。 デフォルト引数は引数の一部またはすべてに指定できる。 デフォルト引数は、関数、メソッドの定義の際に 引数名: 型 = デフォルト値 の形式で定義する。 可変長引数と併用することは…

リストバッファ

ListBuffer は mutable (変更可能) な List。 頻繁に追加、変更する場合は List だと新規に List を作成し直すため処理効率が 低下するので、そんな場合に ListBuffer を使用します。ただし Scala は ListBuffer を暗黙には import していないので、使用する…

List の使い方(続き5)

List の高階メソッド ( exists, forall, sortWith, foldLeft, foldRight ) 特定の条件に合致する要素があるかを判定する リストの要素中に条件に合致する要素があるかどうかを判断する。 要素を引数にとりBooleanを返す述語関数を引数に指定する。 要素中に1…

List の使い方(続き4)

List の高階メソッド ( foreach, map, filter, find, partition ) foreach すでに、何度も使用している foreach はリストの各要素に対して、 引数で指定された関数を適用させる。 foreach に指定する引数は、1つの引数をとり戻り値が Unit(戻り値無し) の関…

部分適用関数、カリー化

部分適用関数 複数の引数をとる関数の引数の一部に値を指定し、残った引数を未適用にした状態の 部分適用関数を作成できる。foo の3つの引数の内、真ん中の引数を未確定にして前後の引数を指定した 部分適用関数値を pa に代入。 pa は foo の真ん中の引数だ…

ローカル関数、プレースホルダー

ローカル関数 関数定義のスコープ内に、関数を定義できる。 同じスコープ内からしか見えないローカル関数になる。 ローカル関数は外側の関数の引数や変数にアクセスできる。 scala> def foo(list: List[String], n:Int) = { | def bar(s: String) = if (s co…

引数の事前条件チェック

コンストラクタの引数や関数の引数がある条件を満たしているかの 事前のチェックは、require を使用する方法がある。 scala> def foo(a: Double, b: Double) = { require(b != 0); a / b } foo: (a: Double, b: Double)Double scala> foo(5, 2) res0: Double…

[Scala] Play 2.0

Play 2.0 *1 の勉強用に貼り付けました。(勉強はこれから) Play framework Play 2.0 Play framework (日本語) Play 2.0 (日本語) 3ヶ月程前の記事ですが、Java から Scala へ .. 見たいな雰囲気。http://www.infoq.com/jp/news/2011/12/playframework-typesa…

副作用

関数型プログラミングでは「メソッドはどんな副作用(side effect)も持ってはならない」 *1 *2 という発想があります。 仕事でも、副作用がないプログラミングはバグを減らせる御利益があると思って java のプログラムで複数のオブジェクトが参照する Map や …

キャスト

Scalaでも型のキャストができる。 が、本来はキャストが不要なプログラムにするべき。汎用的な型でコレクションを作成すると本来の型にキャストしてしないと 処理できない場合がでてくる。Any で List をつくると、要素を取り出して加算を行う場合は "+" の…

アクセス修飾子

java に似ているけれど、違うところ パッケージにも指定できる。 public キーワードは無い。private, protected を指定する。 アクセス修飾子の指定なし(デフォルト)が public の意味。 protected メンバーは定義クラスとその派生クラスのみアクセスできる。…

例外

java によく似た形式だが、Scala は非チェック例外なので throws でチェックする例外を 宣言する必要がないしコンパイルエラーを消すために無理に try catch を記述する必要もない。 (@throwsアノテーションを使えば、throws宣言は可能) また、java の throw…

型推論

基本的な(明示的に型を宣言しなくてもコンパイラが型を推論してくれる)型推論の内容のまとめ 型宣言を省略できる場合 変数宣言時の型の指定 関数の戻り値の型の指定 関数の戻り値の型指定で例外として以下の場合は型の指定が必要になる。 関数内部で再帰呼び…

高階関数、クロージャ

高階関数 関数を引数として受け取る関数または関数を返す関数のことを高階関数と呼ぶ。 文字列の引数 str を受け取って、「Int型整数を引数で受け取り文字列を返す関数」を返す。 scala> def foo(str: String) = (v: Int) => str + v foo: (str: String)(Int…

Ant で FindBugs のチェックを行う。

build.xml に findbugs の設定をしてソースコードのバグパターンチェックを行う。 .. <taskdef name="findbugs" classpath="lib/findbugs-ant.jar" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"/> ... <target name="findbugs" depends="make"> </target></taskdef>

双方向のBiMap

ImmutableBiMap の inverse メソッドを使用してキーと値を反転させて値からキーも取得できる。 import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.BiMap; ..snip.. private static final BiMap<Integer,String> bimap = ImmutableBiMap.of</integer,string>…

Google guava-libraries の Function Predicate Joiner

Function Function で List の要素を変換して、ループの記述無しで新しい List を作成する。 変換する条件は Function の applyメソッドに記述する。 import java.util.List; import com.google.common.base.Function; import com.google.common.base.Joiner…

テンポラリファイル作成

java でテンポラリファイルを作成してくれるメソッドがあった。 File#createTempFile 指定ディレクトリで新しい空のファイルを生成する。 そのファイル名には引数で指定した接頭辞、接尾辞が使用される。 このメソッドが正常に復帰する場合、以下が保証され…

アサーション

java の assert と同じように使用できる。 Predef の関数(メソッド)として定義されている。 scala> assert(0 < 1) scala> assert(0 > 1) java.lang.AssertionError: assertion failed at scala.Predef$.assert(Predef.scala:89) ..snip.. 2個の引数に条件を…

暗黙のインポート

Scala では暗黙に、すべてのプログラムで下の3つのインポート文を追加している。 import java.lang._ import scala._ import Predef._ scala._ scalaパッケージのすべて(Scalaの基本クラス) java.lang._ Javaの標準基本クラス Predef._ Predef オブジェクト…

シンボル、タプル、Option

シンボル シンボルは文字列のかわりに、マップのキーとして使われる事が多い。 シンボルは同じ名前の場合はメモリ上で同じオブジェクトを指す。 シンボルリテラルはシングルクォート(')の後に文字で始まりその後、0個以上の数字か文字が続く。 scala> 'foo r…

List の使い方(続き3)

リスト先頭から指定要素数の後のリストを得る。( drop ) scala> val foo = List(4, 5, 6, 7) foo: List[Int] = List(4, 5, 6, 7) scala> foo.drop(2) res0: List[Int] = List(6, 7) scala> foo.drop(1) res1: List[Int] = List(5, 6, 7) scala> foo.drop(3) …

List の使い方(続き2)

リストの長さを得る。 scala> List(4, 5, 6, 7).length res0: Int = 4 リストの末尾要素、リスト末尾以外の要素のリストを得るメソッド scala> val foo = List(4, 5, 6, 7) foo: List[Int] = List(4, 5, 6, 7) scala> foo.last res1: Int = 7 scala> foo.ini…

List の使い方(続き1)

空のリスト 空のリスト作成でいろいろ試してみる。 scala> val list = List.empty list: List[Nothing] = List() scala> val list2 = List() list2: List[Nothing] = List() scala> val list3: List[String] = Nil list3: List[String] = List() scala> val …

List の使い方(最初は作り方)

Scala の List はイミュータブル(変更不可能)なシーケンス List の空リストは () 又は Nil List の作成は、ファクトリメソッド( List(要素, ..) の形式 ) か :: を使う。 List に対して新しい要素を追加した List を作成する時は :: を使う。 List のファク…

可変長引数(続き)

可変長引数を受け取る関数定義の引数の型は Seq になっているので、List や Array を渡せそうだが そのまま渡すとエラーになる。 scala> def puts(s: String*) = s.foreach(print) puts: (s: String*)Unit scala> val list = List("bar1 ", "bar2 ", "bar3 "…

プログラミング言語の人気ランキング

TIOBE Software の PCI によるプログラミング言語人気ランキングというのを見つけた。 毎月公開しているようだ。 PCI(Programming Community Index)は、複数の検索エンジンの検索結果から対象の プログラミング言語がどれだけ話題になっているかをインデック…

シングルトンオブジェクト(続き)

上のソースのコンパイル後に生成される class ファイルは Foo.class 以外に Foo$.class が生成されていた。 Foo$.class には final class Foo$ extends scala.AnyRef with scala.ScalaObject という final class が自動生成されていた。 コップ本(初版ですが…