noyのブログ

プログラミングとかゲームとか

コップ本でScala入門 - 1 Scalaとは / if、for

はじめに

C言語でプログラミングのセンスがあるかどうかはわからないけど、
関数型言語わからないのはセンスがないよねw」

き 僕 教 な
ず の 授 に
つ 心 の げ
け を 冗 な
談 い
◯ ◯

目標

Scalaスケーラブルプログラミング第3版の内容を理解する。
そしてWebアプリケーション開発へ。
多分失踪する。

Scala とは

関数型プログラミング言語である
でもJavaっぽく書くこともできる。
純粋なオブジェクト指向言語関数型言語が両方そなわり最強な静的型付け言語に見える。初心者が使うと逆に頭がおかしくなって死ぬ。

スクリプト言語のように見えたりもする。

ロゴが螺旋階段

言語別給与ランキングでは上位にいる
需要は少ないが、それ以上に供給が少ない(と思っている)。

scalaを選ぶ理由

互換性
簡潔性
高水準
静的な型付け

プログラミング第一歩

変数

val : 代入不可
var : 代入可能

C++で言うところのこれが、

int a = 5;
const int b = 10;

こう。

var a = 5
val b = 10

型推論の機能を持つので、型名を省略することができる。
セミコロンも省略可。

関数

int max(int a, int b){
	if(a > b) return a;
	else return b;
}

max関数の実装。Scalaでは以下のように実装する。

def max(a: Int, b: Int): Int = {
	if(x > y) x
	else y
}

def 関数名 (変数名: 型, ...): 結果型 = {
	関数本体
}

Scalaでは戻り型を結果型という。
また、三項演算子のようにif式が値を返す。

def greet() = println("Hello, world!")

関数のカーリーブラケットは省略可能。
C++ならこのような関数の戻り型はvoidだが、ScalaではUnitという結果型になる。

インクリメント

i++のような書き方はできない。

forループ

argsの要素を一つずつ表示するコードをC++で書くとこうなる。

for(auto arg : args){
	cout << arg << endl;
}

Scalaはこうなる。

for(arg <- args){
	println(arg)
}

数学記号で言う所の(要素 ∈ 集合)が、Scalaの(要素 <- 集合)に当たる。

また、このような書き方もできる。

for_each(args.begin(), args.end(), [](string arg){ cout << arg << endl;});
args.foreach(arg => println(arg))
args.foreach((arg: String) => println(arg))

(変数名: 型, ...) => 関数本体 //関数リテラル


さらに、一個の引数をとる一文からなる関数リテラルの場合、色々略せる。

args.foreach(println)

短い。

実践

A - Product

object Main extends App {
  val in = scala.io.StdIn.readLine.split(" ").map(_.toInt)
  def func(x: Int): String = if (x % 2 == 1) "Odd" else "Even"
  println(func(in(0) * in(1)))
}

ちなみに、

if (x % 2) "Odd" else "Even"  

だとエラーが返ってくる。

まとめ


競技プログラマーが始めるScala - 2 配列、リストなど - noyのブログ