シンプソン積分をScalaで
Pythonで書いたシンプソン積分をScalaでも書いてみたのだけどfor yieldで総和を求めるやり方が分からなかったので(RandomAccessSeq.Projectionとかいうのが出た)結局var変数で。
def simpson(f: Double => Double, a: Double, b: Double, n: Int): Double = {
val h = (b - a)/n
var sum = 0.0
for (i <- 0 to n-1) {
sum = sum + f(a+i*h) + 4.0 * f(a+i*h+h/2) + f(a+i*h+h)
}
sum * h / 6
}
def func(x: Double): Double = {
1.0 / (1 + Math.pow(x,2))
}
実行
scala> simpson(func, 0, 1, 1000)
res24: Double = 0.7853981633974496
Int,Double,Floatとかの型の使い方もいまいちわかってないな。
Scala+POIでExcelをいじる
xlsxにも対応しているらしいのだけど、今回は普通に。
import org.apache.poi.hssf.usermodel._
import java.io._
object PoiTest {
def main(args: Array[String]) {
val wb = new HSSFWorkbook
val sheet = wb.createSheet("日本語OK")
for (i <- 0 to 9) {
val row = sheet.createRow(i)
for(j <- 0 to 9 ) row.createCell(j).setCellValue(10*i+j)
}
val filename = "workbook.xls"
val out = new FileOutputStream(filename)
wb.write(out)
out.close()
}
}
for
forをまわすところを
for (i <- 0 to 9; j <- 0 to 9) {
sheet.createRow(i).createCell(j).setCellValue(10*i+j)
}
とやると9,19,29...99という列しか入力されないのだけど、理由がわからん。
scala-mode
環境変数にclasspathを設定しててもscala-run-scalaでは読んでくれてないっぽい。そのため、端末からコンパイルして動かすためにmainメソッドを定義したけど、本当はEmacsからスクリプトっぽく対話チックにいじりたい。
chemoinformaics in Scala
朝から、openbabelのjavaインターフェースを使えるようにしようといじっていたのだけど、java.lang.UnsatisfiedLinkErrorを解決することができないまま夕方になってしまった。
んーCDK使うことになるのかなぁと思ったがMXのほうが楽そうなので今回はこっちを使った。
import com.metamolecular.mx.calc.MassCalculator
import com.metamolecular.mx.io.daylight.SMILESReader
object MxTest {
def main(args: Array[String]) {
val calc = new MassCalculator
for (mol <- args) {
val mw = calc.findAveragedMass(SMILESReader.read(mol))
println(mol + ": " + mw)
}
}
}
実行してみる
scalac mxtest.scala
scala MxTest "CCC" "CO" "CNC"
CCC: 44.09562
CO: 32.04186
CNC: 45.08368
Liftを使って構造関係を扱えるWikiを作ってみたい。
Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)Martin Odersky,Lex Spoon、Bill Venners
インプレスジャパン / ¥ 4,830 ()
在庫あり。
Scalaプログラミング入門 6-9章
一通り読んだ。
次の2章は内容がついて行けないとこがあったので、また読み返すことになると思う。
- 6章 アクターと並行処理
- 7章 トレイトと型、アーキテクトの秘密道具
7章でドウェムジーのRubyのやつをScalaに移植するっていう話があったんだけどRubyの元ネタ知らんかったので。
8章はパーサーで、よくある四則演算だったのでわかりやすかった。後半でJSONパーサ書いてtwitterにアクセスするというサンプルがあったのだけど、後で手動かしてみる。
入門ってかいてあるけど、最初に読む本としてはつらいかも。Scalaスケーラブルプログラミングのほうが入門には適してる。
Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)Martin Odersky,Lex Spoon、Bill Venners
インプレスジャパン / ¥ 4,830 ()
在庫あり。
Scalaプログラミング入門 1-5章
5章まで。6章はアクターで難しい(急激にスピードが落ちた)
名前渡し(p.36)
変数名と型の間に =>を記述 def delayed (t: => long) {とか
これは結局クロージャみたいなもんを渡してるのかな?
scala> val x = () => "test"
x: () => java.lang.String = <function>
scala> x
res0: () => java.lang.String = <function>
scala> x()
res1: java.lang.String = test
scala> def y() = { "tttt" }
y: ()java.lang.String
scala> y
res2: java.lang.String = tttt
いまいちわからん。
部分適用と関数(p.104)
Haskellでは(Int, Int) => StringとInt => Int => => Stringは同じですが、Scalaでは違います。
「Scalaプログラミング入門」を予約した
早くこないかな
ScalaでXML
ScalaそのままXMLを取り込める。ダブルクォーテーションで囲むと文字列として認識する。
scala> val a = <p><name>kzfm</name><address>fuji</address></p>
a: scala.xml.Elem = <p><name>kzfm</name><address>fuji</address></p>
scala> val b = "<p><name>kzfm</name><address>fuji</address></p>"
b: java.lang.String = <p><name>kzfm</name><address>fuji</address></p>
これは、さらにXPath風のメソッドが使える
scala> a \ "name"
res1: scala.xml.NodeSeq = <name>kzfm</name>
型を変換したり、要素の中身を取り出してみる。
scala> a \ "name" toString
res2: String = <name>kzfm</name>
scala> a \ "name" text
res3: String = kzfm
Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)Martin Odersky,Lex Spoon、Bill Venners
インプレスジャパン / ¥ 4,830 ()
在庫あり。
Scalaのzipが
なんか慣れない。
scala> Array(1,2,3) zip Array(4,5,6)
res1: Array[(Int, Int)] = Array((1,4), (2,5), (3,6))
Haskellだとこんな感じでしょ。
Prelude> [1,2,3] `zip` [4,5,6]
[(1,4),(2,5),(3,6)]
Pythonだと
[1,2,3].zip([4,5,6])
とはできない。
>>> zip([1,2,3],[4,5,6])
[(1, 4), (2, 5), (3, 6)]
Monads in Scala
Scalaスケーラブルプログラミングを11章まで読んで、構文を多少理解したので、Monads in Scalaを読んだ。
要するにモナドはforに宿るってことでいいのかな。
bind [e1] (\v1 -> bind [e2] (\v2 -> unit(v1 + v2)))
というbindが出てきてこれはScalaのforだと。
for {v1 <- e1; v2 <- e2} yield v1 + v2
みたいな。
なるほどと思ったのであった。
Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)Martin Odersky,Lex Spoon、Bill Venners
インプレスジャパン / ¥ 4,830 ()
在庫あり。
Scalaはインタプリタが遅いのがたまに気になる。
本を購入
本をまとめ買いした。
Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)Martin Odersky,Lex Spoon、Bill Venners
インプレスジャパン / ¥ 4,830 ()
在庫あり。
LOLは今回は買わないでおいた。
美文書作成入門は新版でるっていう噂を聞いたのでそれまで待つ。



Scalaプログラミング入門
入門Git
Linux-DB システム構築/運用入門 (DB Magazine SELECTION)
ビューティフルアーキテクチャ
Linuxカーネル2.6解読室
[改訂第4版] LaTeX2ε美文書作成入門