かなり眠い状態でやっているので、かなりアホな解答を書いているかもしれませんが、とりあえず手をつけたので掲載します。

2.2.5 練習問題

練習問題 2.1

自分の解答

  1. This expression has type int but is here used with type int
  2. This expression has type int but is here used with type int
  3. -2
  4. This expression has type int but is here used with type int

実行結果

# - - 1;;
- : int = 1

# - 2+3;;
- : int = 1

# 9 / -4;;
- : int = -2

# +3 + 5;;
Characters 0-1:
  +3 + 5;;
  ^
Syntax error

1番目は"-"が中置演算子ではなく前置演算子として評価されたため、"-(-1)"という式と同じように評価され、"1"を返したのだと思う。

2番目は"-"がやはり前置演算子として評価され、その結果"-2"と"3"の和の式として評価された結果だと思う。

3番目は正解。

4番目はエラー"+"が前置演算子にならないことは覚えていたが、エラーメッセージの種類を間違えた。

練習問題 2.2

自分の解答

  1. float型で5.5
  2. int型で0(小数点以下切り捨て)
  3. char型でU
  4. エラー("0xff"という文字列をint型に変換できない)
  5. Syntax error("**"がダメ)

実行結果

# float_of_int 3 +. 2.5;;
- : float = 5.5

# int_of_float 0.7;;
- : int = 0

# char_of_int ((int_of_char 'A') + 20);;
- : char = 'U'

# int_of_string "0xff";;
- : int = 255

# 5.0 ** 2.0;;
- : float = 25.

1番目から3番目は正解。

4番目は"0xff"という16進数表記のint型整数値として変換され、それをそのままint型として返した。

5番目は"**"がべき乗演算子と知りませんでした。

練習問題 2.3

自分の解答

  1. "*-"が1つの演算子として評価され、エラーとなる。
  2. "0xfg"の"g"が16進数ではないので、エラーとなる。
  3. "-"が中置演算子として認識され、両側の式がint型ではないため、エラーとなる。

実行結果

# 8*-2;;
Characters 1-3:
  8*-2;;
   ^^
Unbound value *-

# int_of_string "0xfg";;
Exception: Failure "int_of_string".

# int_of_float -0.7;;
Characters 0-12:
  int_of_float -0.7;;
  ^^^^^^^^^^^^
This expression has type float -> int but is here used with type int

全問とも一応正解?。3番目についてはint型の式であるべきところに"float -> int"変換の式があるのでエラーとなっている。試しに"int_of_float 3.2 -0.7"とやったら、今度は"0.7"の方を指しte 「float型だよ」というエラーを返してきた。

練習問題 2.4

自分の解答

  1. float_of_int (int_of_float 5.0)
  2. 三角関数はきれいサッパリ忘れたので省略。sinやcosの引数に3.14なんて数字を与えているからラジアンで渡しているんだろうという想像はつくけど、そこから先は分かりません。
  3. int_of_float (sqrt (3. *. 3. +. 4. *. 4.))

実行結果

# float_of_int (int_of_float 5.0);;
- : float = 5.

# int_of_float (sqrt (3. *. 3. +. 4. *. 4.));;
- : int = 5