今回は、他の言語から来た人間が、F#に拒絶反応を示す原因となるかもしれない、F#のオブジェクト指向、命令型プログラミングを、例によってScalaから見ていく。
※私はF#をやると決めているので、まぁ、こんなものとF#の現実として受け止めている。
勉強させていただくのは、net-kさんのF#入門サイト
命令型プログラミング より、 「whileの例」
◇F#
let counter = ref 5
while !counter > 0 do
printfn “counter=%d” !counter
counter := !counter-1
◇Scala
var counter = 5
while (counter > 0) {
println (“counter=%d”.format(counter))
counter -= 1
}
F#では、mutableな変数を扱うためには、ref(参照)の理解が欠かせない (!や:=が気になる人も多いだろう)。Immutableなプログラミングを推進すべく、mutableな記述に抵抗感を抱くよう、あえて導入された構文・・なのかな(いわば、「大リーグ養成ギブス」)??
val => immutable, var => mutableというシンプルなルールのScalaでは、手続き型(命令型)のプログラムをJavaっぽく普通に書ける
—[Scalaでの実行結果]—
scala> var counter = 5
counter: Int = 5
scala> while [...]
F#, Scala
Hide
(JavaEE)などのJVM環境と.NET環境の相互運用というと、JavaとC#というのが定番だが、Scala使い的にはScalaとF#でいってみたいと個人的に思っている。
※F# -> MS流OCaml。
※OCaml使いの人からすると微妙なのだろうが、F#のlight構文はScala使いからするとそんなに悪くない感じ
今回は、Codezineでの星山氏のF#入門記事を勉強させてもらいながら、気になるところをランダムにscala化して比べてみる。
※F#の方の解説は全面的にCodezine記事にゆだねてます。
■Scalaの再帰関数の宣言
def facto(n:Int) : Int =
if (n <=1 ) 1 else n * facto(n-1)
F#で再帰関数[Codezine]
メモ F#では再帰関数をlet recで宣言
[実行結果]scala> print(facto(5))
120
■Scalaの高階操作
お題 : 1,2,3という要素からなるリストの各要素を2倍して、一つずつ表示する ※元の例が1行なのでこちらも1行で
List(1,2,3).map(_*2).foreach(println(_))
F#/C#でリスト[Codezine]
感想 F#よりC#の方が分かりやすいなぁ
メモ F#のパイプライン記号は、“|>” #JavaやScalaの”.”に相当(?)
■Scalaのカリー化
: Scalaのカリー化について詳しくは、A Life in 新宿さんの解説を参考にしてほしい
def testadd (x:Int)(y:Int) = x + y
F#では、let testadd x y = x + y (codezine) ※Scalaでは括弧が省略できない場合が多いが、F#(OCaml)では多くの場合、省略可能。趣味もあるだろうが、F#の方を好ましく思う人もいることだろう。
scala> def add1 = testadd(1) _
add1: (Int) => Int
scala> add1(2)
res12: Int [...]
F#, Scala
Hide