Haskellは関数型プログラミングであるが故、手続き型プログラミングでよくみられる「変数を複数宣言してそれらを管理する」手法は一般的ではありません。
しかし、Haskell言語の中にも型と変数の仕組み自体は存在し、特に型の考え方は重要になります。 この記事ではHaskellの型について深く紹介します。
Haskellの変数と型
Int型
Haskellで整数を扱うためにはInt
型を使用します。
次のコードは変数x
, y
にそれぞれ123
と234
を代入して、足した結果を画面に出力しています。
x :: Int y :: Int x = 123 y = 234 main = print $ x + y
x :: Int
およびy :: Int
はそれぞれ変数x
とy
の型を宣言しています。ここでは、x
とy
が整数 (Int
) であることを示しています。x = 123
およびy = 234
はそれぞれ変数x
とy
の値を定義しています。x
には 123、y
には 234 が代入されています。main = print $ x + y
はmain
関数を定義しています。Haskellのプログラムはmain
関数から始まります。このmain
関数では、print
関数を用いてx + y
の結果を標準出力に出力しています。$
は関数呼び出しの演算子で、f $ x
はf x
と同じです。この場合、print $ x + y
はprint (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
x :: String
およびy :: String
はそれぞれ変数x
とy
の型を宣言しています。ここでは、x
とy
が文字列 (String
) であることを示しています。x = "Hello!."
およびy = "This is Haskell code"
はそれぞれ変数x
とy
に文字列を代入しています。main = print $ x ++ y
はmain
関数を定義しています。ここでは、文字列の結合 (++
演算子) を行っています。print
関数を使って結果を標準出力に出力しています。$
演算子は右側の式を評価し、その結果を左側の関数に渡します。この場合、print $ x ++ y
はprint (x ++ y)
と同じ意味です。
ここで、print関数を実行する際に、Int型の時は+
だったのがString型の時は++
に代わっている点に注意してください!
+
はInt型
同士の足し算にしか使用できず、++
はString型
同士の結合にしか使用できません。
python
やjava
はこのあたりの制約が緩いのですが、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ではそのほかに以下のような型が使用できます。
- Int:
有界整数型。例:
42
- Integer:
任意精度整数型。例:
123456789012345678901234567890
- Float, Double:
浮動小数点数型。
Float
は単精度、Double
は倍精度。例:3.141592653589793
- Char:
文字型。例:
'A'
- Bool:
真偽値型。
True
またはFalse
。例:True
- String:
文字列型。例:
"Hello, Haskell!"
page:https://minegishirei.hatenablog.com/entry/2023/11/22/085647