Scala

Scalaでflip+fold(L|R)

flip(2引数関数の引数を逆転させる高階関数)がすぐに見つからなかったので書いてみた。 foldLeft, foldRightで使えるのでは?と思って実験。 object Flip { def main(args : Array[String]) : Unit = { val list = List("恋しさ", "せつなさ", "心強さ") def…

インデックス付きforeachほか

概要 先日Javaで書いたインデックス付きforeachループ http://d.hatena.ne.jp/kya-zinc/20100107/1262856312 をScalaで書いてみた。 (なお、Scalaのfor-comprehensionはループ以外にも使える。) Iterableのデフォルト実装は便利。

インクリメントパターン?

デザインパターンのパターンではなくパターンマッチのパターン。 Haskellにはn + kパターンという、漸化式を書きやすくする構文があるのだが Scalaで試みる。

if式オーバーロード

注意 本物のif式ではありません。 if式っぽいもの。 概要 動的型付け言語では、if式(条件式)がいろいろな型について使える。 (数値型、オブジェクト型、など) それを静的型付けのScalaでやってみる。

呼ぶといなくなる関数

概要 呼ぶとそれ自身がいなくなるような関数はないものかと一考。

続・名前のない再帰関数

前回のエントリー http://d.hatena.ne.jp/kya-zinc/20091205/1259999256 を考え直した。 要するに無名関数からthis(自分自身の参照)が見えればよいので applyの引数として渡してやる。 呼び出しにはもう一つの無名関数f => f(f)を使ってやる。 object Anonym…

名前のない再帰関数

PowerShellのパイプで再帰 再帰呼び出しでスタックオーバーフローします。 それだけ。 {& $_} | % {& $_} Scalaの無名関数で再帰? Scalaの無名関数で再帰ができるのかどうか気になった。 object AnonymousRec { def main(args : Array[String]) : Unit = { …

Exception tableがついちゃってました

バイトコードを見てみよう 前回のエントリー id:kya-zinc:20091204 でコンパイラにバグがあったことを知った。 何が違ったのかな、と思い、Javapコマンドでバイトコードを見てみた。 問題の関数のみ抜粋。バグあり版 public void finally_rec(int); Code: 0:…

finally連鎖が止まらない

注意 (12/4追加) コンパイラのバグでした。 fixされている模様です。 概要 finallyの中でenclosing関数の再帰呼び出しをするのは非常に危険。

returnとthrowの鎖

概要 Scalaのreturn, throw(の結果)はNothing型(すべての型のサブタイプ)をもつので、 returnで、returnを評価した結果(Nothing型)を返すことができる。 これを利用して、return{return{...などで遊ぶ。

不動点演算子と再帰呼び出しのアスペクト

動機 再帰呼び出しにメモ化がかかってほしい。 概要 Scalaでは、高階関数と遅延評価が使えるので 不動点演算子を実装することができる。 自分で再帰を書く代わりに不動点演算子を使う書き方を試み 再帰呼び出しのメモ化ができることを確認する。

君は必ずmainのところに戻ってくる

(8/5更新) 実験4を追加。 概要 Scalaでは、遅延評価が許されているので returnがメソッドの実行ではない場所で評価されることがある。 これで遊んでみる。 実験1: foreachの中でreturn まずは簡単な使い道。foreachに渡すブロックの中でreturnする。 package…

スタックオーバーフローしない相互再帰

概要 相互再帰(互いに呼びだし合う再帰)が 末尾再帰(再帰呼び出しが末尾のみに出現)の場合、 ループでスタックを積まずに実行することができる。 このための高階関数を用意する。参考: 相互再帰 http://ja.wikipedia.org/wiki/相互再帰 相互再帰の例: Intの…

オーバーライドできるtry-catch-finally

注意 タイトルは嘘です。 正確にはtry-catch-finallyらしきもの。 概要 try-catch-finallyをメソッドでラップし、拡張可能にする。 メソッドチェインで本物に似せる。 動機 printStackTraceなど、お決まりのtry-catch-finallyを書くのが面倒。 基礎知識 必要…

ファンクションの上からスタックを見下ろす

動機 Iterable.foreachなど、関数を引数にとるメソッドの実装を知りたい。 予備知識 必要な知識はこのへん。 メソッド呼び出しはスレッドごとにスタックを積む 関数呼び出しはFunction1.applyを実装したメソッドの呼び出しである Throwableをnewすると、その…

Scala入門・ゼロと後者関数

動機 自然数ってゼロとサクセサーだよね。 概要 ゼロは自然数である 自然数の後者はまた自然数である という自然数の作り方がある。Scalaの1つの特徴は、コンストラクタ以外のパターンマッチが書けること。 一般に関数型言語でパターンマッチができるのは、…

Scala入門・幅優先探索

動機 幅優先探索(などのグラフアルゴリズム)を学部生に教える授業に参加した。 よい機会なので、Scalaになじむため幅優先探索を実装した。 方針 幅優先探索はグラフをたどるだけではなく たどりつつ、各ノードについてほげほげするのが目的なので bfsの第2引…