第3章 型とクラス #1

さて、そろそろHaskellらしいところに入ってきたかな。

型を示すには、式 :: 型 と書く。

なんだか、いきなり前振りなしで「評価されていない式」って言葉が出てきた。Haskellの遅延評価のことを言っているのかもしれないが、唐突すぎるだろ。この本のこういう所は嫌だな。

Hugs:typeコマンドを学んだ! Hugs:loadコマンドが、プログラム中ではimportと同じということを学んだ!

  • Bool
    • 真偽値。TrueFalse
  • Char
    • 文字。シングルクォート。
  • String
    • 文字列。ダブルクォート。
  • Int
    • 固定精度整数。普通の32ビット符号付き整数。オーバーフローに注意。
  • Integer
  • Float
      • だとすればNaN、+∞、-∞も値に含まれるはず。あとで出てくるかな?
  • [T]
    • T型のリスト。遅延評価されるので無限リストもOK。
      • Hugs:type ["a","b"]って入れたら[ [Char] ]って返ってきた……たぶんStringは[Char]でもあるんだろうけど。
  • (T1, T2,...,Tn)
    • タプル。要素は必ず有限。
      • 要素0のタプルはunit。
      • 要素1のタプルは禁止。
  • Tin→Tout
    • 関数。定義域が制限されていてもOK。
      • を複数並べると、カリー化された関数を表す。は右結合だからT1→T2→T3T1→(T2→T3)と違いがない。
      • ただし(T1→T2)→T3は違う型。こっちは関数を引数に取る関数になる。
      • カリー化されていない多変数関数を定義したい場合はタプルを使って(T1,T2,...,Tn)→Toutとやってもいいが、カリー化された関数のほうが柔軟。
      • 0引数の関数は、遅延評価される値と違いがないので、→Tという型の関数はない。T型があるだけ。
      • ()→Tという型は定義できるが、unitを引数に取るので0引数にはならない。(Hugsで試した。)
      • たぶんT→のような戻り値がない関数も定義できないのではないだろうか。何らかの意味のない値(たとえばunit)を返すようにするとか。