Edited at

JavaプログラマがHaskellに入門してみた(Haskellにおける型)


はじめに

 本記事は、実務でJavaを使用している私がHaskellに入門してみようという記事です。

 なるべくわかりやすく書くことを心がけたいです。

 JavaやJavaScriptと勝手が違うと感じる…


Haskellにおける型

Haskellは静的型言語で、動的言語とは違いコンパイルで型のチェックを行います。

例として、以下のようなコードはコンパイルエラーとなります。


sample.hs

[1 , 2 , 3] :: Int

--[1,2,3]はList型であり、Int型ではない為コンパイルエラー。

Haskellは型推論を行ってくれる言語であるため、明示的に型を示す機会は少ないと思いますが、

以下の記述で型を明記できます

データ :: 型名

上記のsample.hsは、Javaで置き換えると以下と同様です。


sample.java

int sample = new int[]{1 , 2 , 3};


コンパイルエラーとなるのも無理はないですね…


Haskellで扱える型

基本データ型の一例としては、以下があります。

Char  : Unicode文字を扱う

Bool : 真偽値(True or False)を扱う
Int : 32or64ビットまでの整数を扱う
Integer : 大きさに制限のない整数を扱う
Double : 小数を扱う
String : 文字列を扱う(正確にはchar型のリストを扱う)

それぞれ型を明記する場合は、上記に対応する値以外は格納できません。

余談ですが、Javaで置き換えると

Char→char

Bool→boolean
Int→int
Integer→long
Double→double
Float→float
String→String

となります。自分の普段使用する言語に置き換えてみるとわかりやすいかもしれません。


タプルとリスト

他の言語と同様に、Haskellでも複数の値を扱えるリストとタプルがあります。


sample.hs

--Int型のリストを作成

[1,2,3] :: [Int]

--タプルを生成
(100000 , "STr" ,'a' ,True)


リストは、長さに決まりはないが、同一の型である必要があります。

タプルは、固定長だがデータ型に制限がないという特徴があります。

Pythonの経験がある方なら同様の名前の定義があることはご存じでしょうが

Haskellのタプルは変更可能ではありません。

Javaで書くなら…こうでしょうか


sample.java


// なんか違う気が…
List<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);


タプルは適したものが思いつきません・・・

外部ライブラリや独自実装をする必要があります。


おわりに

Haskellの型はここで紹介したもの以外にもあります。

また、ListはHaskellにおいて重要なデータ型であるそうです。

Javaもラムダ式やストリーム、最近だと型推論(var)のように

モダンになってきていますが、Haskellの綺麗なコードと

Javaの綺麗なコードでは、読みやすさに結構差がでそうな気がしています。