Haskellの変数と型一覧【Haskell, 関数型プログラミング】

Haskell関数型プログラミングであるが故、手続き型プログラミングでよくみられる「変数を複数宣言してそれらを管理する」手法は一般的ではありません。

しかし、Haskell言語の中にも型と変数の仕組み自体は存在し、特に型の考え方は重要になります。 この記事ではHaskellの型について深く紹介します。

Haskellの変数と型

Int型

Haskellで整数を扱うためにはInt型を使用します。

次のコードは変数x, yにそれぞれ123234を代入して、足した結果を画面に出力しています。

x :: Int
y :: Int
x = 123
y = 234
main = print $ x + y
  1. x :: Int および y :: Int はそれぞれ変数 xy の型を宣言しています。ここでは、xy が整数 (Int) であることを示しています。
  2. x = 123 および y = 234 はそれぞれ変数 xy の値を定義しています。x には 123、y には 234 が代入されています。
  3. main = print $ x + ymain 関数を定義しています。Haskellのプログラムは main 関数から始まります。この main 関数では、print 関数を用いて x + y の結果を標準出力に出力しています。
    • $ は関数呼び出しの演算子で、f $ xf x と同じです。この場合、print $ x + yprint (x + y) と同じ意味です。

変数の宣言と代入は、次のように一度に行うことが出来ます。

x = 123 :: Int
y = 234 :: Int
main = print $ x + y

リスト型

リストは複数の値をまとめて扱うための型です。

ghci> []
ghci> ["foo", "hoge", "hoge", "star"]

一つのリスト内のすべての要素は同じ型でなければなりません。 違う型だと以下のようなエラーが出力されます。

ghci> ["foo", 10]

<interactive>:1:9: error: [GHC-39999]
    • No instance for ‘Num String’ arising from the literal ‘10’
    • In the expression: 10
      In the expression: ["foo", 10]
      In an equation for ‘it’: it = ["foo", 10]

数値のリストも当然作成可能です。

ghci> [10,  11]

また、連続した値であれば、以下のように列挙表記で書くことも可能です。

ghci> [10..20]
[10,11,12,13,14,15,16,17,18,19,20]

リストにはステップを指定することもできます。その際には、二つ目の値を指定することで、その差分を推定してくれます。

ghci> [10,12..20]
[10,12,14,16,18,20]

二つ目の値を一つ目の値よりも低くすることで、減少するリストを作成することも可能です。

ghci> [20,18..10]
[20,18,16,14,12,10]

小数点を指定することも可能です

ghci> [1.0,1.5..10.0]
[1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0]

二つのリストを結合するには++演算子を使用します。

ghci> [1,2,3]++[4,5]
[1,2,3,4,5]

文字列型

Haskellで文字列型を扱うにはString型を使用します。 ですが、内部的にはString = [Char]であり、文字列のリストと同義です。 そのため、++演算子を使用することが可能です。

次のコードは基本的な文字列型の操作を示しています

x :: String
y :: String
x = "Hello!."
y = "This is Haskell code"
main = print $ x ++ y
  1. x :: String および y :: String はそれぞれ変数 xy の型を宣言しています。ここでは、xy が文字列 (String) であることを示しています。
  2. x = "Hello!." および y = "This is Haskell code" はそれぞれ変数 xy に文字列を代入しています。
  3. main = print $ x ++ ymain 関数を定義しています。ここでは、文字列の結合 (++演算子) を行っています。print関数を使って結果を標準出力に出力しています。
    • $ 演算子は右側の式を評価し、その結果を左側の関数に渡します。この場合、print $ x ++ yprint (x ++ y) と同じ意味です。

ここで、print関数を実行する際に、Int型の時は+だったのがString型の時は++に代わっている点に注意してください!

+Int型同士の足し算にしか使用できず、++String型同士の結合にしか使用できません。 pythonjavaはこのあたりの制約が緩いのですが、Haskellは型の制約をかなり厳しく指定します。

上記のコードで+++に変えた場合、以下のようなエラーが出ると思います。

[1 of 1] Compiling Main             ( strbar.hs, strbar.o )

strbar.hs:5:16: error:
    • No instance for (Num String) arising from a use of ‘+’
    • In the second argument of ‘($)’, namely ‘x + y’
      In the expression: print $ x + y
      In an equation for ‘main’: main = print $ x + y
  |
5 | main = print $ x + y
  |                ^^^^^

そのほかの型

Haskellではそのほかに以下のような型が使用できます。

  1. Int: 有界整数型。例: 42
  2. Integer: 任意精度整数型。例: 123456789012345678901234567890
  3. Float, Double: 浮動小数点数型。Floatは単精度、Doubleは倍精度。例: 3.141592653589793
  4. Char: 文字型。例: 'A'
  5. Bool: 真偽値型。True または False。例: True
  6. String: 文字列型。例: "Hello, Haskell!"

page:https://minegishirei.hatenablog.com/entry/2023/11/22/085647