use JavaFX from Jython

I love Python, even on JVM! So, I decided to use JavaFX from Jython.

This article is a 20th day of JavaFX Advent Calendar 2012

I started translating Java code on this article into Jython.

Setting up Environment

We need JavaFX SDK and Jython which can use it. A following sequence is actual processes I went through.

To obtain JavaFX developing environment, I installed JavaFX for Java SE 7.

Following this instruction, I made Java 7 as a default JDK.

$ sudo mv /System/Library/Java/JavaVirtualMachines/1.6.0.jdk /System/Library/Java/JavaVirtualMachines/1.6.0.jdk.bak
$ sudo ln -s /Library/Java/JavaVirtualMachines/1.7.0.jdk /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
$ java -version
java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)

Next I compiled Jython with Java 7.

$ hg clone https://bitbucket.org/jython/jython
$ cd jython
$ ant
$ ls dist/bin/jython

The result jython executable exists at dist/bin/jython. When I compiled, the Mercurial changeset ID is 6898:2ccd73a00a86 and Jython version is 2.7.0a2+.

Now, all had been set up.

Hello, World!

Since ...

Scalaz の Functor trait を初心者が実装してみた

Scalaz Advent Calendar の 10 日目の記事として書いています.

前回の記事 では Functor の構造について数学の定義を対比させながら書きました. 今日は Scalaz を使ったプログラムを書いて Functor の実装をしてみましょう.

準備

今回の実装をするために sbt で管理している Scala プロジェクトを作成しました. 同じ環境を作成して色々触ってみると楽しいと思います. 実際, 私は自分で実装してみて Functor の使い方がより分かるようになりました.

私は以下の環境で作業しました. (scala, scalaz は sbt で取得するので, sbt のバージョンさえ合っていれば同じ作業ができるはずです)

sbt 0.12.1
scala 2.10.0-M7
scalaz 7.0.0-M3
Giter8 0.4.5

Giter8 についてはこちらを参照してください. http://blog.twiwt.org/e/f12c0f

前置き

説明を簡単にするために implicit なものは使っていません. 対象を函手で写すときには, implicit conversion を使うと綺麗に書けるのですが, 今回はそこが本題ではないので敢えて使っていません.

今回は以下のページを参考にしました.

環境準備

g8 typesafehub/scala-sbt コマンドを実行して, パッケージ名など適宜答えていきましょう. scala のバージョンを聞かれたら 2.10.0-M7 としておいてください.

<project_root>/project/<project_name>.scala に sbt の設定を追加して, scalaz が利用できるようにします.

resolvers += "Typesafe Snapshots" at "http://repo.typesafe.com/typesafe/snapshots/",

libraryDependencies ++= Seq(
  "org.scalaz" % "scalaz-core" % "7.0.0-M3" cross CrossVersion.full
),

scalacOptions += "-feature",

initialCommands in console := "import scalaz._, Scalaz._"

実際のファイルは https://bitbucket.org/cocoatomo/scalazsample/src/e5efd3d7b750/project/ScalazsampleBuild.scala?at=default を見てください.

次に <project_root>/src/main/scala/<package_hierarchy>/なんとか.scala に以下の import 文を追加します.

import scalaz.Functor

ソースコードは https://bitbucket.org/cocoatomo/scalazsample/src/a451998f4f2fa9ab09771622a333e9dd9fbe64b9/src/main/scala/net/elliptium/Scalazsample.scala?at=default を見てください.

そして最後にコンソールに戻って sbt run コマンドを実行すると, scalaz-core の取得が行われ, プログラムが動きます. g8 コマンドの引数に typesafehub/scala-sbt を指定してプロジェクトを作成した場合, "Hello, <project_name>" メッセージが出力されるだけのプログラムになっているはずです.

作成する Functor

今回作成する Functor は Important という名前にします. 普通の「クラスの圏」から「重要なクラスの圏」への函手というイメージになります. 今回持ち上げる射の例として length というものを選びます. 図式を書くと以下のようになります.

              lift(length)
Important[String] → Important[Int]
       ↑                ↑
       ↑                ↑
       ↑                ↑
     String       →     Int
                length

length: String => Int 函数は名前の通り「文字列の長さ」を返すものです. Important という Functor は「2重にする」函手です. 実体は Tuple2 に似た case class で, toString をちょっとイジってあります. これはソースコードを見た方が理解が早いでしょう.

実装

Important

これが Important[T] の実装です.

case class Important[T](val value: T) extends Product2[T, T] {

  def _1: T = value
  def _2: T = value

  override def toString: String = value.toString + ", " + value.toString

}

このクラスのコンストラクタで「普通のクラス T 」を「重要なクラス Important[T] 」に持ち上げています. 図式の以下の矢印にあたります.

Important[String]    Important[Int]
       ↑                ↑
       ↑                ↑
       ↑                ↑
     String ...

Scalaz の Functor.scala を初心者が読んでみた

Scalaz Advent Calendar の 6 日目の記事として書いています.

準備

今回解説するソースコードは scalaz/Functor.scala です.

scalaz-seven ブランチのものであることに注意してください.

前置き

数学 (代数) は一応やってはいたものの, Scala や Scalaz のことを全然分からない状態からこの記事を書いています. そんな人間が Scalaz を読んだらどう見えるか? という実験記録のようなものがこの記事です.

圏論については「圏論の基礎」を参照しています. 用語などはそちらに倣いました.

数学の函手とは

最初にざっと圏論の概念の定義を並べておきます.

圏 (category) の定義

  • 圏とは対象 (object) と対象の間の射 (arrow) の集まり

    • f はある対象 a とある対象 b を結び付けるもの

      この射は方向を持っているので f: a → b のように表記することが多いです

      この af のドメイン (domain, source), bf のコドメイン (codomain, target) と言います

  • 各対象 c には id c という c から c への射 (恒等射, identity) が存在する

  • f: a → b, g: b → c があったとき, それらをつないだ合成射 (composite) g・f: a → c も存在する

    • 恒等射 id c: c → c と合成の関係は以下の通り

      • f: b → c, g: c → d としたとき (id c)・f = f, g・(id c) = g

        つまり恒等射は合成 (composition) 演算の両側単位元です

    • 複数の合成がつながっている場合合成の順序は問わない

      f: a → b, g: b → c, h: c → d があったとき, (h・g)・f = h・(g・f)

      いわゆる結合則 (associative law) です

つまり圏とは群と群の間の準同型の集まり, のようなものです. この喩えでは, 対象が群という1つの集合なのですが, 圏論では群の元1つ1つについて直接扱わない流儀を採ります.

圏を図で書くと, 圏は対象をノードとし, 射をエッジとする有向グラフになります. これを図式 (diagram) とかと呼んで, 圏の説明で使ったりします.

函手 (functor) の定義

この対象と射を含む圏どうしの間にも対応付け (函手, functor) を考えることができます. 射が対象どうしの対応付けだったのに対し, この函手は圏どうしの対応付けになっていて 1 段上のメタなものになっています.

  • 函手とは圏と圏の間の対応付けで, 対象を対象に, 射を射に対応付ける

    型を考えると対象を写すものと, 射を写すものは別の関数になるのですが, 同じ記号で書いても混ざることは無いので同じ記号を援用したりします

    • 函手 T が写した対象と射の関係は以下の通り

      • T(id c) = id Tc

        恒等射を恒等射に写します

      • T(f・g) = T(f)・T(g)

        合成を保ちます

この函手を大雑把に説明すると, 圏の中にある図式を別の圏に写すものです.

Scalaz の Functor とは

ここまでを踏まえて Scalaz の Functor が数学の函手になっているのか見ていきましょう.

実装

まず Functor の先頭部分は以下のようになっています.

trait Functor[F[_]]  { self =>
  ////

  /** Lift `f` into `F` and apply to `F[A]`. */
  def map[A, B](fa: F[A])(f: A => B): F[B]

  // derived functions
  ...

F という Functor を宣言し, map というメソッドの型が定義されています.

他のメソッドは Functor#map メソッドを使って実装されているので, 最低限 Functor#map だけ実装すれば良さそうです. (このあたりはまた後日追い掛けます)

数学の定義と対比して

Scalaz の Functor はいったいどんな函手なのかを見てみましょう.

Functor#map の型を見てみると以下のようになっています.

/** Lift `f` into `F` and apply to `F[A]`. */
def map[A, B](fa: F[A])(f: A => B): F[B]

これから map メソッドは fa: F[A]f: A => B を受け取って, F[B] 型のインスタンスを返すのが分かります. 意図としては, f という関数を持ち上げて fa に適用しています.

図式として書くと以下のようになります.

F[A] → F[B]
 ↑      ↑
 A   →  B

函手のドメインである圏には AB が対象として存在し, f が射として存在しています. 下の段の矢印が射 f です.

A → B
  f

対象 A, B をそれぞれ持ち上げているのが型パラメータを 1 つだけ受け取る型クラス F です.

  F[A]   F[B]
F ↑    F ↑
  A ...

Licenses