さて、そろそろHaskellらしいところに入ってきたかな。
型を示すには、式 :: 型
と書く。
なんだか、いきなり前振りなしで「評価されていない式」って言葉が出てきた。Haskellの遅延評価のことを言っているのかもしれないが、唐突すぎるだろ。この本のこういう所は嫌だな。
Hugsの:type
コマンドを学んだ!
Hugsの:load
コマンドが、プログラム中ではimport
と同じということを学んだ!
Bool
型- 真偽値。
True
とFalse
。
- 真偽値。
Char
型- 文字。シングルクォート。
String
型- 文字列。ダブルクォート。
Int
型- 固定精度整数。普通の32ビット符号付き整数。オーバーフローに注意。
Integer
型- これ必要だよね。C#には長らくなかった。(.NET 4から標準ライブラリに入った)
Float
型- だとすればNaN、+∞、-∞も値に含まれるはず。あとで出てくるかな?
[T]
型- T型のリスト。遅延評価されるので無限リストもOK。
- Hugsで
:type ["a","b"]
って入れたら[ [Char] ]
って返ってきた……たぶんStringは[Char]でもあるんだろうけど。
- Hugsで
(T1, T2,...,Tn)
型- タプル。要素は必ず有限。
- 要素0のタプルはunit。
- 要素1のタプルは禁止。
Tin→Tout
型- 関数。定義域が制限されていてもOK。
→
を複数並べると、カリー化された関数を表す。→
は右結合だからT1→T2→T3
はT1→(T2→T3)
と違いがない。
- ただし
(T1→T2)→T3
は違う型。こっちは関数を引数に取る関数になる。
- ただし
- カリー化されていない多変数関数を定義したい場合はタプルを使って
(T1,T2,...,Tn)→Tout
とやってもいいが、カリー化された関数のほうが柔軟。
- カリー化されていない多変数関数を定義したい場合はタプルを使って
- 0引数の関数は、遅延評価される値と違いがないので、
→T
という型の関数はない。T
型があるだけ。
- 0引数の関数は、遅延評価される値と違いがないので、
()→T
という型は定義できるが、unitを引数に取るので0引数にはならない。(Hugsで試した。)
- たぶん
T→
のような戻り値がない関数も定義できないのではないだろうか。何らかの意味のない値(たとえばunit)を返すようにするとか。
- たぶん