2011年1月23日日曜日

これでやっとバッチリそうなscalaのユークリッドの互除法がかけた…気がする。

これでやっとバッチリそうなscalaのユークリッドの互除法がかけた…気がする。


val euc = new Function2[Int, Int, (Int, (Int, Int, Int))]{
  private val chg = (x:Int, y:Int) => if(x > y) (x, y) else (y, x)
  private val bas = new Function2[Int, Int, Int]{
    def apply(x:Int, y:Int):Int = {
      val t = chg(x, y)
      if(t._1 % t._2 == 0) t._2 else apply(t._2, t._1 % t._2)
    }
  }
  def apply(x:Int, y:Int):(Int, (Int, Int)) = {
    val q = bas(x, y)
    (q, (x/ q, y/ q))
  }
}

2011年1月20日木曜日

Scalaの関数をvalに結びつける方法とdefで宣言することの違い

いや、べつに大したことではないのですが、

Scala、というか関数言語初心者の自分には驚きなので、

書いておこうと思いました。


まず、defについて。

scala> def hoge(x:Int, y:Int):(Int, Int) = if(x > y) (x, y) else (y, x)
hoge: (Int,Int)(Int, Int)

scala> hoge(-1,1)
res0: (Int, Int) = (1,-1)

scala> hoge
<console>:6: error: missing arguments for method hoge in object $iw;
follow this method with ` ' if you want to trea it as a partially applied function
       hoge
       ^
scala>

どうやらdefは暗黙のオブジェクト$iwに対してメソッドを定義しているようです。


では一方の、val変数に関数を結びつける場合は、こうなります。
scala> val huge = (x:Int, y:Int) => if(x < y) (x, y) else (y, x)
huge: (Int, Int) => (Int, Int) = <function>

scala> huge(-1,1)
res1: (Int, Int) = (1, -1)

scala> huge
res2: (Int, Int) => (Int, Int) = <function>
で、この場合は、val hugeに対してメソッドが割り当てられているので、

引数なしでこのメソッドを呼び起こしても、定義そのものが返ってくる。





どちらが使いやすいかというと、後者のほうがやり安い気がする。

2011年1月13日木曜日

Scalaでユークリッドの互除法

単純なプログラムを書いてみた。
Scalaでユークリッドの互除法。


01
def baseEucledian(x:Int, y:Int):Int = {
02
  val a = if(x > 0) x else 1
03
  val b = if(y > 0) y else 1
04
  val tpl = if(a > b) (a, b) else (b, a)
05
  if(tpl._1 % tpl._2 == 0) tpl._2 else baseEucledian(tpl._2, tpl._1 % tpl._2)
06
}
07
def extEucledian(x:Int, y:Int):(Int, (Int, Int)) = {
08
  val q = baseEucledian(x, y)
09
  (q, (x / q, y / q))
10
}


02~04が美しくないので、少し書きなおしてみる。
02~04は交換をしているだけなので、交換を関数にする。


01
def baseChange(x:Int, y:Int):(Int,Int)  = {
02
  if(x > y) (x, y) else (y, x)
03
}


こうすると、02~04は次のように書き換えられる。


02
  val tpl = baseChange(baseChange(x, 1)._1, baseChange(y, 1)._1)


ずいぶん綺麗になった気がする。
scalaはリファクタリングが重要な言語らしい。

2011年1月12日水曜日

mike、mikeなるままに…

ブログを作成してみた。

たぶん、プログラミングの話が書かれると思うけど、
それほど専門性が高いわけでもないし、
テクニカルなネタが書かれるわけでもない。

いちおう、趣味でAndroidやってるけど、
それほど得意というわけでもない。
趣味で、Rubyやってるけど、
これまた得意というわけでもない。
JavaとかRubyのコーディングに飽きたときに、
Scalaをやってみることにしたけど、
これまた浅い知識で終わると思う。

じゃ、何が売りなの?ということになるけど、
雑食性が売りかもしれない。

時に、ジル・ドゥルーズの話になるかもしれないし、ベンヤミンも大好き。
よく考えたら、第二外国語(スペイン語)の他に、ラテン語とフランス語もやってた気がする。
理系で大学に入学したのに文系で卒業しているし、でも仕事はSE(?)だけど、
仕事をやって、一番覚えたのはコマンドプロンプトのような気がする。
三週間の予定で行って、結局六週間もいたインドネシアでもインドネシア語を覚えつつあったし、
韓国旅行に行ったらハングル文字読めるようになってた。
プログラミング言語も、BASICからはじまって、
CASL-II、C、VB-6、VBA、javascript、Java、Ruby、コマンドプロンプト覚えてるし。

浅くて広いように見せかけて、実は浅くて狭い。
そのようなmike、mikeな世界を書いていこう。