Scala

Scala 2.9でパターンマッチでコンパイルエラー

Scalaはパターンマッチ内で正規表現を使ってマッチするかどうかの判定及びマッチした箇所の抽出が出来る。 val regex0 = "(.*)hell".r val input = "nutshell" val result = input match { case regex0(p) => Some(p) case _ => None } assert(result == Som…

不変オブジェクトで循環参照をつくる

お題: 新しい状態を作るにはcopyメソッドで新たなインスタンスを作ります。 そうすると結局お互いに保持している参照が古い状態を指していることになるので、参照を新しいものに付け替えなければなりません。 先の例ではvar属性だったため、再代入することで…

同じ名前のメソッドを持つクラスに対するimplicit defを2つ定義してimportした場合のコンパイルエラーがScala2.9と2.10で異なる件

「同じ名前のimplicit defを2つ定義してimportした場合の挙動がScala2.9と2.10で異なる件 - xuwei-k's blog」みて思い出したので確認してみた。Scala 2.9.1 + scalaz 6.0.3で下のようなコードを書いてコンパイルすると "reassignment to val" エラーになる…

Play2.0でパラメータを型安全に受け取る

アクションに渡すときはパスやクエリストリングはアクションの引数の形に変換する必要がありますが、その変換ルールを定めているのが PathBindable[T], QueryStringBindable[T] といった implicit object です。conf/routes では例えば Int などはではデフォ…

Play2.0で日付入力部品を作る

"Play 2.0"もとい"Playframewok 2.0"もとい"Play framework 2.0"で*1、既存のコンポーネントを組み合わせて、新しいコンポーネントを作りたい。 例えば、日付を入力するのに、セレクトボックスで「年」「月」「日」を選んで入力するフォームを考える。 こう…

Play2.0でセレクトボックスにEnumを貼れるようにする

スタプラわー!(挨拶) 第8回全国戦優勝者です(本当) 携帯ゲームって初めてやったけど運営が伏せたルールをプレイヤーが当てる遊び的な感じですね。 折角攻略法見つけても「あれ不具合だから修正しました」て言われる恐ろしい展開もある。 閑話休題、"Play 2.…

Play2.0でURLに一律でパラメータを付ける

"Play 2.0"もとい"Playframewok 2.0"もとい"Play framework 2.0"です。検索しにくいんだよksg。 使ったバージョンは2.0.3です。 あまり良いやり方じゃない気がするので、良いやり方があれば教えて下さい。 目的 Play 2.0でHTMLテンプレート上でアクションを…

Z会三年生中学受験コース5月のてんさく問題を Scala で解いてみた

Scalaの練習です。お題: 4けたの数について、それぞれの位の数字を大きいじゅんにならべた数から小さいじゅんにならべた数をひくという計算を行います。 1974 について、この計算を 100 回行った答えを書きなさい。 Z会三年生中学受験コース5月のてんさく問…

ListとStreamの両方でheadとtailにmatchさせる

Listを扱うプログラムを書く時に、match式で::を使ってheadとtailを取り出すことが良くあると思う。 例えば、「二つのList a, bがあり、bがaに前方一致するならaからbを取り除いた残りを戻す」というような処理をmatchを使って書くと*1、こんな風になるかと…

文字列テンプレートを型安全にする

パーサとテンプレートエンジンって丁度動きが逆だよなあと前から思ってたんだけど、てことはパーサコンビネータっぽい感じで文字列テンプレート書けないかと思った。 一応見た感じそれっぽく出来たけど、なんか格好悪い実装になってしまった。真性のScalaユ…

メソッドの実装クラスを探す

Scalaでコード書いていて、標準クラスの実装方法を見てみたくなることがある。※例えば、Listクラスのproduct()メソッドの実装など ソースコードを見るのに、メソッドがどこに実装されているかを知る必要があるんだけど、Javaのインターフェスと違ってScalaは…

構造的部分型とJavaのボックス型

Scalaの勉強してたら嵌った。挙動が良く分からない。 Scala使いには常識あるいは仕様読めwな話かもしれないけど。 実用性の話ではなくてパズル的な話です。 Scalaのバージョンは2.9.1 文字列をくっつける 引数a1とa2を取って文字列として連結したい。a1の型…

ScalazのValidationの謎

import scalaz.Validation.Monad._するとエラーがaccumulateされないのはなぜか。 まだちょっと良く分かってないので自分の理解を書く。ちなみにScalaz 6.0.3の話です。 Monadは普通Applicativeになる このへんの話から。また、Monad[M[_] ]はApplicative[M]…

続・ScalazのValidationでFizzBuzz

前回のヤツのいくつか補足。 まだまだ勉強中だけど。 ValidationでFizzBuzz(anonymous left版) scalaz/example/ExampleApplicative.scala見てたらFizzBuzzにぴったりのオペレータ見つけたので書き直した。 import scalaz._ import Scalaz._ object FizzBuzzB…

ScalazのValidationでFizzBuzz

Scalaz使ってみたかったのでScalaインストールした。 Scala素人なのでコードおかしいかも。 import scalaz._ import Scalaz._ object FizzBuzz { def makeValidator(d:Int, msg:String) = { (n:Int) => if (n % d != 0) n.success else nel(msg).fail } val …