戦略 Scala 日記

素人プログラマの思考のセンス

case classはコンパニオンオブジェクトのなかで定義すべき理由

Scalaでデータなどを扱うときにはcase classを使うのが一般的である。 このcase classはコンパニオンオブジェクトに書くのが当たり前のようになっているがそれはなぜか。 ScalaでもJavaと同様、インナークラスを定義できる。 しかし、その違いとして「パス依…

trait / case class / object どう使ったら良いのかって話

聞きかじった話を、今後考える課題としてメモ。 結論Scalaではclassは使わないってお話。 オブジェクト指向でシステムを設計するときに必要なものは、ざっくり分けると インタフェース(メソッド) データ(メンバ) このふたつ。 あとは、これを実体化して…

【FPIS】Scala関数型デザイン&プログラミング 読書メモ

出版から半年ほど時間が経ってしまいましたが、「Scala関数型デザイン&プログラミング」を読み進めていく際の自分用のメモを公開しようと思います。 関数型プログラミングとは 副作用のない関数=純粋関数 純粋関数だけで構築=関数型プログラミング プログ…

並んだ、並んだ、mapの処理が

OptionやCollectionに対して、連続して処理をする場合など。 mapが並ぶこと、ありますよね。 seq.map(f).map(g) こんな感じにmapが連続してチェーンするなら、関数合成してしまいます。 composeする間でもないので、andThenを使います。 seq.map(f.andThen(g…

headOptionを見つけたら

リストから、条件にマッチする先頭の要素をOptionで取り出すときに list.filter(somefunc(_)).headOptionとしたり、 条件にあった値の存在を確認するときにlist.filter(somefunc(_)).headOption.nonEmpty なんて書いてあるコードを見つけたら、ほかのCollect…

Scalaで全角数字を半角数字に変換。その再帰、たたみ込める?

全角数字を半角数字に置き換えるというよくある処理。 再帰関数を自分で定義して書くなら、次のようになります。 def fullWidthNumberToHalfWidthNumber(str: String): String = { val fullWidthNumbers = List("0", "1", "2", "3", "4", "5", "6", "…

GuavaのChacheをScalaから使って、定期的にインスタンス変数のキャッシュをリセットする

GuavaのChacheをScalaから使って、定期的にインスタンス変数のキャッシュをリセットする DBのコネクション数などを考えれば、Remote Actorのインスタンス変数に、 値をキャッシュするようなケースは容易に想像できる。 このインスタンス変数でキャッシュをす…

IntelliJでScalaのシンタックスハイライト、サジェストがおかしいときに疑うこと

IntelliJ IDEAのシステムキャッシュを削除してみる システムキャッシュの問題でシンタックスハイライトが正常に動作しない現象もまれに起こるため、まずはこれを疑ってみます。 メインメニューからFile | Invalidate Caches/Restartを選択し、表示されるタイ…

Scalaでシステムプロパティを読み込むときの定石

例えばpropnameという名前でJVMのシステムプロパティを取得したい場合、指定したシステムプロパティが存在しない場合にはデフォルト値を返すというように、次のように記述することができる。 Option(System.getProperty("propname")).getOrElse("defaults") …

Scalaでモナドを、なんとなくイメージするためのヒント

Scalaでモナドを説明する際には、まずリストを用いるのがイメージしやすい。 scala> List(2, 3, 5, 7, 11, 13, 17, 19).foreach(println) 2 3 5 ... このListの値に効果を与えて、与えられたものを関数(ここではprintln)でシーケンシャルに評価している。 …

ライブラリや自分のコードの動きを確認したいときに"sbt console"が便利

自分のプロジェクトで使っているライブラリや、書いているコードをちょっとだけテストしたい場合などに、sbt consoleを利用する。 本稿では、sbt.version = 0.13.5を想定している。 今回は、Scalaの非同期HTTP通信用ライブラリのDispatchを例に、 このライブ…

Tuple3以上をもつListから、Tupleの値をキーにMapを作成する

たとえば、次のようなリストがあったとする。 val members = List( ("Momota", "red", 1994), ("Tamai", "yellow", 1995), ("Sasaki", "pink", 1996), ("Ariyasu", "green", 1995), ("Takagi", "purple", 1995) ) これを、Map("Momota" -> ("red", 1994), "T…

ActorSystemはインポートして使う。遅延評価する。

まず、必要なActorSystemをobjectで作っておく。 この時、ActorSystemは遅延評価(lazy val)するとよい。 // MyActorSystems.scala object MyActorSystems { lazy val someActorSystem = ActorSystem("some", config) } ActorSystemは読み込んで使うように…

Doubleにべき乗演算子をつくるには?finalクラスを拡張する方法

Scalaの暗黙の型変換については、以前にも扱った。 形式知にして使う、暗黙のimplicit - 戦略 Scala 日記 今回は、implicit classを使って、クラスを拡張する方法を考える。 また継承が禁止されているJavaのfinalクラスを拡張して、オリジナルなメソッドをつ…

高階関数の引数あれこれ

カリー化した関数定義で、引数に渡した高階関数に 別の引数リストの結果を渡すとき、下記のように定義すると java.lang.AssertionErrorとなる。 def func1(x: Int)(g: Int => Int): Int = g(x) ここで注意したいのは、1つ目の引数リストの結果を一度 ローカ…

Optionにはifを使うなfilterを使え

ウェブアプリケーションを作っていると、下記のコードのvalue変数のように、値を受取るOption型の変数の中に値が入っている場合、かつ空文字列ではない場合のみ処理をしたいというケースはよくある。 val value: Option[String] = Some("1234") if (value.is…

Hello Slick! チュートリアルで学ぶSlickの基本作法

Typesafe Activatorのチュートリアルとして用意されている、Hello Slick!のソースコードを元に、Slickの基本的な使い方を紹介する。 Hello Slick! - Typesafe Activator | Typesafe http://typesafe.com/activator/template/hello-slick activator uiコマン…

形式知にして使う、暗黙のimplicit

「暗黙のXX」と訳される、Scalaの"implicit"キーワード。 しかし、その動作をちゃんと理解しないままでも、 Scalaのimplitiキーワード(暗黙のXX)が使われるのは次の2つの場合。 暗黙の型変換 暗黙の引数 これだけなのだが、初学者にとってややこしく感じる…