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月23日日曜日
これでやっとバッチリそうなscalaのユークリッドの互除法がかけた…気がする。
これでやっとバッチリそうなscalaのユークリッドの互除法がかけた…気がする。
2011年1月20日木曜日
Scalaの関数をvalに結びつける方法とdefで宣言することの違い
いや、べつに大したことではないのですが、
Scala、というか関数言語初心者の自分には驚きなので、
書いておこうと思いました。
まず、
どうやら
では一方の、
引数なしでこのメソッドを呼び起こしても、定義そのものが返ってくる。
どちらが使いやすいかというと、後者のほうがやり安い気がする。
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でユークリッドの互除法。
02~04が美しくないので、少し書きなおしてみる。
02~04は交換をしているだけなので、交換を関数にする。
こうすると、02~04は次のように書き換えられる。
ずいぶん綺麗になった気がする。
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な世界を書いていこう。
たぶん、プログラミングの話が書かれると思うけど、
それほど専門性が高いわけでもないし、
テクニカルなネタが書かれるわけでもない。
いちおう、趣味でAndroidやってるけど、
それほど得意というわけでもない。
趣味で、Rubyやってるけど、
これまた得意というわけでもない。
JavaとかRubyのコーディングに飽きたときに、
Scalaをやってみることにしたけど、
これまた浅い知識で終わると思う。
じゃ、何が売りなの?ということになるけど、
雑食性が売りかもしれない。
時に、ジル・ドゥルーズの話になるかもしれないし、ベンヤミンも大好き。
よく考えたら、第二外国語(スペイン語)の他に、ラテン語とフランス語もやってた気がする。
理系で大学に入学したのに文系で卒業しているし、でも仕事はSE(?)だけど、
仕事をやって、一番覚えたのはコマンドプロンプトのような気がする。
三週間の予定で行って、結局六週間もいたインドネシアでもインドネシア語を覚えつつあったし、
韓国旅行に行ったらハングル文字読めるようになってた。
プログラミング言語も、BASICからはじまって、
CASL-II、C、VB-6、VBA、javascript、Java、Ruby、コマンドプロンプト覚えてるし。
浅くて広いように見せかけて、実は浅くて狭い。
そのようなmike、mikeな世界を書いていこう。
登録:
投稿 (Atom)