Scalaに入門したい。#2 変数と関数

さて前回「Scalaに入門したい。#1 インストール - 風の谷の備忘録」はインストールまでやった訳だが、とりあえず基本的なことからみていきたいと思う。

私自身は
Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)
これを読んだり、色々なサイトを巡りながら、これをまとめている。

Scalaは関数型オブジェクト指向言語

正直言ってサッパリわかんねぇぜ!!

  • 関数型
    • これは、LispとかHaskellみたいな言語のことを言う。

概要

関数型言語は、広い意味ではファーストクラスの関数オブジェクトを持つ言語である。また、純粋関数型言語では、全ての関数が副作用を持たない。関数型言語の多くは、カリー化、遅延評価などの機能を備えている。また、静的型付けの物の多くは型推論の機能を持つ。

引数の評価が関数の実行より先に行われることを正格であるといい、そのような性質を正格性と呼ぶ。正格性に関して非正格である言語は通常、デフォルトでの遅延評価を採用している。純粋関数型言語は遅延評価を標準とし、非純粋関数型言語は正格評価(先行評価)を標準としている。

関数型言語 - Wikipedia

オブジェクト指向プログラミング (OOP、英: object-oriented programming) とは相互にメッセージ (message) を送りあうオブジェクト (object) の集まりとしてプログラムを構成する技法である。この技法をサポートするプログラミング言語オブジェクト指向プログラミング言語 (object-oriented programming language, OOPL) と呼ばれる。オブジェクト指向プログラミングには必ずしもオブジェクト指向プログラミング言語を用いる必要は無いが、オブジェクト指向プログラミング言語の備えるクラスとその継承などの仕組みを利用するほうが格段に開発効率は向上する。

オブジェクト指向プログラミング - Wikipedia

うん。分からん。
こういうのは使っていくうちに分かってくるものだと思っているので、深くは考えないでおく。
たぶんどっちの書き方も出来るよってことなのだろう。

とにかく試してみる

うだうだ考えても仕方ないので試してみる。

Hello World!!

scalaインタプリタを起動して

scala> println("Hello World!!")
Hello World!!

scala>

・変数

scalaの変数にはvarとvalの2種類ある。
var
これは変更可能な値で、variableの略

scala> var num : Int = 2
num: Int = 2

scala> num = 3
num: Int = 3

val
これは変更不可能な値、valueの略

scala> val hoge : Int = 2
hoge: Int = 2

scala> hoge = 3
<console>:6: error: reassignment to val
       hoge = 3
            ^

変更不可能なので、こんな感じでエラーがでる。

・変数の宣言

上の例でも見た通りで

scala> var num : Int = 2
num: Int = 2

[変数の種類] [変数名]:[値の型] = [変数の値]
という形になる。これだと相当ダルイけどScalaには型推論という便利なものがありまして

scala> var amicable = 220
amicable: Int = 220

scala> var hello = "Hello World"
hello: java.lang.String = Hello World

[変数の種類] [変数名] = [変数の値]
とこんな感じで値をみて型を自動的に割り当ててくれる。
まあ多少楽です。

・値の型

Scalaでは基本型として以下が存在する。

  • 基本型
    • 数値型
      • Byte
      • Short
      • Int
      • Long
      • Float
      • Double
    • Char
    • String
    • Boolean

この辺はjavaと同じなので詳しく書かない。

・関数

scala> def hello (name : String) : String = {
     | "Hello " + name                       
     | }
hello: (String)String

scala> hello("Scala")                        
res9: String = Hello Scala
def [関数名] ([引数名] : [引数の型]) : [結果型(戻り値の型のこと)] = {
    〜〜〜関数の中身〜〜〜
    }

となる。基本的に最後に行った演算を返す…のかな?
hello:(String)Stringは
関数名:([引数の型])[結果型]の表記に従ったもの

scala> def test (num : Int) : Int = {        
     | num + 1
     | }
test: (Int)Int

scala> test(5)
res10: Int = 6

そうみたい。一応明示的なreturnもあるけど、それだと関数型っぽくならないよね〜

・結果型の型推論

scala> def test2 (num : Int) ={
     | num+1
     | }
test2: (Int)Int

scala> test2(4)
res11: Int = 5

結果型を指定しなくても型推論して戻してくれる。
再帰などのときは明示的指定する必要があるとか

・voidな関数

scala> def void ()={
     | println("hoge")
     | }
void: ()Unit

scala> void
hoge

void : ()Unitについて
・()は引数がない事を意味する。
・Unitは関数が意味のある値を返してこない事を意味する。javaのvoidみたいなもん

第三回へ;Scalaに入門したい。 #3 制御構文 - 風の谷の備忘録