Scala日記

Scalaの備忘録。ときどき研究の話。

Argmax: Seqが関数であることを利用してmax値のインデックスを簡潔に取る

以前、Scala の Seq が関数であることを書きましたが、 ym.hatenadiary.jp これを利用して、最大値のインデックスを取得する関数を簡潔に実装することが出来ます。 val seq = scala.util.Random.shuffle(1 to 10) seq.indices.maxBy(seq) 美しいですね。 max…

None を含むオブジェクトを Java の deep clone ライブラリで clone すると複数の None オブジェクトができる。この None は case 文で match しない。

完全にハマったので覚書。 ディープクローンを手軽にやりたくて、このライブラリを使ったはいいのだけど、 github.com 突然 case 文で None が case None => にマッチしなくなった。 そんなことがありうるのかと思って調べてみたら、このあたりで議論されて…

基本コンストラクタの引数は他のメソッド内で使わない場合 private field として保持されない

入門書で明示的に教えてくれないシリーズその2。 class A(s:String){ def i = s.toInt } class B(s:String) class C(s:String){ val i = s.toInt } 上のようなコードにおいて、Aのsが private field として保持されるのはみんな知っているが、BやCのsが pri…

Gnu Parallel の良い入門用資料

「今日から使い切る」 ための GNU Parallel による並列処理入門 from Koji Matsuda www.slideshare.net

Option型のコレクションから Some(x) の値 x だけを取り出すには flatten

val opts: Seq[Option[Int]] = Seq(Some(2), None, Some(3)) のようなものから値のあるものだけを取り出して、 List(2, 3) を作りたいときに、Scalaを覚えたての頃はやり方がよく分からなくて、最初にやっていたのが opts.filter(_ != None).map(_.get) だっ…

=> Unit と () => Unit と Unit => Unit の違い

先日、op: Unit => Unit と書かざるを得ない状況に直面した。それで、この関数を op()として呼び出したときに「多分あなたが意図していることと違うことしてますよ」みたいなwarningが出て気づいたこと。ScalaのUnitは値がないことを表す型なわけだが、「実…

Scala で 言語処理100本ノック 2015 を解く

東北大学 情報科学研究科 情報伝達学講座(乾・岡崎研究室)で作成された自然言語処理入門者のための教材「言語処理100本ノック 2015」というのがあるんですが、これを Scala で解いてみました。 github.com だいぶん前に書いたもので、問題が公開された直後…

Project Eulerで用いた数学知識

オイラーにちなんだ数学的なプログラミングの問題が出題されるサイト、Project Euler。 大体の問題は、greedy にやっても解けるんですが、適切な数学的知識を用いると時間計算量のオーダーが劇的に変わってきます。 そこで、100問目まではラップトップで…

ScalaFX で sorting visualizer を 作る

Scala で GUI を作るときには、JavaFX8 compatible な ScalaFX というライブラリが使えるが、参考資料が非常に少ない。練習がてらに ScalaFX で ソーティングアルゴリズムを可視化・可聴化するプログラムを作ってみた。 github.com 動いているところ このプ…

Unicodeの拡張領域の文字を一文字とカウントする

ScalaやJavaは拡張領域の文字をサロゲートペアで表すので、文字数をカウントしたいときに単純に文字列のサイズを取ると実際の文字数とずれてしまう。Java 1.5からはUnicodeのコードポイント を数えるメソッドが追加されているので、これを使えば正確に文字数…

UTF-8のはずのテキストの処理中に MalformedInputException で落ちる場合の対処

Webなどから取ってきた巨大な文書ファイルを処理するとき、UTF-8エンコーディングで処理したはずだったのに、中間処理に使った言語の仕様なのか処理ミスなのか、とにかく何らかの理由があって、Scalaで読み込む際に MalformedInputException が発生してしま…

Spark用sbtプロジェクトの設定

プロジェクトセットアップ build.sbtに以下のコードを書いて、sbt update gist.github.com ソースを書く src/main/scala/SampleApp.scala gist.github.com ビルド sbt package 実行 spark-submit \ --class SampleApp \ --master yarn-cluster \ --num-execu…

xmlファイルをstdinから読み込む

import scala.xml.parsing.ConstructingParser val doc = ConstructingParser.fromSource(Source.stdin, preserveWS = true).document()

sbtで実行するときにstdoutにsbtのログを出さないようにする

sbt経由でプログラムを実行すると [info] Loading project definition from... [info] Set current project to ... [info] Running ... や [success] Total time: 3 s, completed 2015/07/... などが「標準出力」に出てしまって、出力をリダイレクトして処理…

Appトレイトを使って定義したmain関数を並列コレクション操作の中で呼び出すと並行に走らない。

先日のScalaハマリポイント。Appトレイトを使って定義したmain関数を並列コレクション操作の中で呼び出すと並行に走らない。問題自体の解決策は分かったが、何故そのような挙動になるのかは未解決。 あるプログラムに処理結果を吐き出させ、すぐさまその結果…

Sparkの資料

Sparkの素晴らしい資料が公開されました。これを見ればすぐにMapReduceでPMIが計算できるようになります。 Apache Spark チュートリアル from K Yamaguchi www.slideshare.net

型消去の結果同じ引数型になってしまうメソッドをオーバーロードする その2

以前の話の続き。 型消去の結果同じ引数型になってしまうメソッドをオーバーロードする - Scala日記ym.hatenadiary.jp DummyImplicitという型を使って下のような書き方をする作法もあるらしい。 gist.github.com 使わない暗黙のパラメータを取ることで引数リ…

Arrayをprintしたい時は deep

ScalaのArrayは前回の問題のせいで、toStringで要素の値を文字列に出来ないが、WrappedArrayというラップ型に変換すれば中身も文字列化される。このため、適当にtoSeqなどして表示するわけだが、WrappedArrayという文字列が長くてイライラするし、多次元配列…

sbtで使われているclasspathを取り出す

以下のワンライナーでOK sbt "export compile:dependency-classpath" | tail -1 | scala -e 'import scala.io.StdIn;StdIn.readLine().split(":") foreach println'

型パラメータAを含むSeq[A]をtoArrayするときには実行時型が必要

昨日のScalaハマリポイント: 型パラメータAを含むSeq[A]をtoArrayするときには実行時型が必要 例えば、次のようなSchoolクラスがあったとする。 gist.github.com このクラスはStudentもしくはその子クラスのコレクションをメンバに持っている。このクラス設…

ScalaのSeqやMapは関数である

Arrayに関数オブジェクトを突っ込んでいるときに、「Arrayだって数学的には写像なんだから、Array[A => B]をInt => A => B だとみなせないのかな?」と思っていたら、ScalaのSeqがPertialFunctionトレイトを継承していることを発見。ちゃんと実現されていた…

Continuation-passing style で複数リソースの try-with-resource 構文を入れ子なしで書く

前回の話の続き。 Scala の標準ライブラリを使って try-with-resource 構文相当の表現を書く - ymの日記ym.hatenadiary.jp 末尾の参考文献によれば、CPS: Continuation-passing style(継続渡しスタイル) によって入れ子なしの記述を実現する方法もあるとの…

法律文の構文解析はとっても難しい

法律文の構文解析がいかに難しいかをよく説明する例。 この例文の中だけでも、かなり難しい要素がある。 ↓以下は「一文」です。 労働者の養育する子について、当該労働者の配偶者が当該子の 1 歳到達日以前のいずれかの日において当該子を養育するために育児…

Functional pearls

Functional pearls という素敵な論文集を見つけた。 日本語の訳本 関数プログラミング 珠玉のアルゴリズムデザイン作者: Richard bird,山下伸夫出版社/メーカー: オーム社発売日: 2014/11/12メディア: 単行本(ソフトカバー)この商品を含むブログ (1件) を…

EnumerationのvaluesはSotedSetを返すのでマップした結果もソートされる。

今日のScalaハマリポイント: EnumerationのvaluesはSotedSetを返すので、マップした結果もソートされる。 gist.github.com なにかやんごとなき理由があるのかもしれないが、直感には反するのでかなりのハマリポイント。 このせいで3〜4時間は費やしてしまっ…

型消去の結果同じ引数型になってしまうメソッドをオーバーロードする

学生さんから、「関数リテラルを引数に取るメソッドをオーバーロードするときはどうするのがスマートだと思いますか?」と聞かれて、ちょっと調べてみた。 どういう場合かというと、 gist.github.com みたいな場合。引数一つの関数オブジェクトはFunction1[-…

Scala の標準ライブラリを使って try-with-resource 構文相当の表現を書く

Scalaには標準では try-with-resource 構文が備わっていないが、自分で簡単に実装できるので、一般的にはこんなかんじのコードをそれぞれ書いて使う。 gist.github.com 標準ライブラリの範囲でできる書き方が何かないかなと模索していたら、こんな書き方がで…

for 式内での変数束縛の罠

今日のScalaハマりポイント: for 式内の変数束縛のタイミングが直観に合わない。 挙動をちゃんと知っていれば理解は出来るけれど、気を使って書かなければいけないのはデメリット。 gist.github.com 普通に読むと、iを束縛した後、bestを束縛して、jを回す…

untilで作ったRangeはshuffleできない

今日のScala悲しみポイント 「untilで作ったRangeはshuffleできない」 gist.github.com ↓ なんと、toで作ったRangeとuntilで作ったRangeでは型が違うらしい。 gist.github.com ↓ Listのように明示的に列挙されているコレクションに変換すればもちろんshuffle…

ScalaのREPLでコードの構文木を見る

scalaに-Xprint:<phase>オプションを渡すことでコードの構文木を見ることができる。 シンタックスシュガーの展開などをチェックするのに便利。 この状態で for式を入れると、デシュガーの結果がわかる。 gist.github.com -Xprintオプションに渡す出力フェーズは、"s</phase>…