HASIGOLOG

Scala雑記 – 関数型言語!?

どうもこんにちは!

株式会社ハシゴにてインターン中の福岡大学の大坪です。

前回はScalaでHelloWorldと足し算をやってみました。

今回は掛け算で九九の計算をやってみますー!!

なぜ九九かって?それは関数型スタイルで書く九九の計算が新しくて面白いなーと感じたからです。そんだけです。笑

Scalaスケーラブルプログラミング(通称コップ本)に掲載されている、九九の掛け算を例にみてみたいと思います。

目的はこのような九九の表を作成することです。10の段まであるじゃんとか突っ込まないでください。

kuku

まずはオブジェクト指向で一般的な命令型での書き方:

[scala] object kuku {
def main(args: Array[String]) {
printMultiTable()
}
def printMultiTable() {
var i = 1
while (i <= 10) {
var j = 1
while (j <= 10) {
val prod = (i * j).toString

// 数字の間隔を一定に保つ
var k = prod.length
while (k < 4) {
print(" ")
k += 1
}
print(prod)
j += 1
}
println()
i += 1
}
}
}
[/scala]

この書き方はこれまでC言語などを勉強したことのある方であればわかりやすいのではないでしょうか。

これを関数型で書くと以下のようになります!

[scala] object kuku {
def main(args: Array[String]){
println(multipleTable())
}

// 一段分を配列として返す
def makeRowSeq(row: Int) =
for(col <- 1 to 10) yield {
val prod = (row * col).toString
val padding = " " * (4 – prod.length)
padding + prod
}
// 一段分を文字列として返す
def makeRow(row: Int) = makeRowSeq(row).mkString

// 1行に一段分の文字列を収めた表を返す def multipleTable(a:Int) = {
val tableSeq =
for (row <- 1 to 10)
yield makeRow(row)
tableSeq.mkString("\n")
}
}
[/scala]

なんということでしょう。
計算に変数(var)が用いられることがなく、さらに2重にあったwhileループがなくなっているではありませんか!こりゃあ良い!

Scalaにおけるfor文,yield節など理解しておかないといけないということはありますが、簡単に説明しますと

Ⅰ、九九の表の一段分を配列として返す関数
Ⅱ、Ⅰの配列を文字に変換する関数
Ⅲ、Ⅰ,Ⅱの流れを10段分繰り返し、表として返す関数

という流れになっています。

慣れないと大変な面も多く私もだいぶ悩んでいますが、関数型スタイルを使うと繰り返しなどのありふれている処理を開発者から隠し、抽象化できるようです。

このためコードを読みやすくしたりバグを減らすことに役立つと言われているため、頑張って習得したいと思います!

余談ですがこの前こんな本を買ってみました。

Evernote-Camera-Roll-00270127-015517

リーダブルコードはエンジニアの方や友人の間で話題になっていたのでついつい買ってしまいました。

まだ少ししか読めていませんが、読んでいて驚かされることが多く感じます。

Gitは業界の共通言語としてもっと勉強しておこうと思って買ってみました!

今回はこのへんで、それではまた。

RECRUIT

採用情報

私たちと一緒に

働いてみませんか?

to the next page

CONTACT

お問い合わせ

ご相談など

お気軽にご連絡ください

to the next page