4

私はOCamlを学んでいます、そしてこれは私の最初のタイプされた言語です、それで私に我慢してみてください:

練習のために、私は関数「除算」を定義しようとしています。これは、2つのintを入力し、「inta」が「intb」に均等に分割されるかどうかを説明するブール値を出力します。私の最初の試みでは、次のようなものを書きました。

let divides? a b =
if a mod b = 0 then true
else false;; 

タイプエラーが発生しました:

if a mod b = 0 then true
  ^
Error: This expression has type 'a option
       but an expression was expected of type int

それで私はそれを好転させようとしました、そして私はこれをしました:

let divides? a b =
 match a mod b with
  0 -> true
 |x -> false;;

これはあまり役に立ちませんでした: Characters 26-27 match a mod b with ^ Error: This expression has type 'a option but an expression was expected of type int

それから私はこれを試しました:

let divides? (a : int) (b : int) =
 match a mod b with
 0 -> true
|x -> false;;

これを引き出したのは:キャラクター14-15:分割しましょう?(a:int)(b:int)= ^エラー:このパターンはint型の値と一致しますが、オプションの'型の値と一致するパターンが予期されていました。

私は今、型システム全般に関して非常に混乱していてイライラしています。(私の最初の言語はSchemeでした、これは私の2番目です。)私がどこで間違っているのかを説明する助けとそれを修正する方法の提案は大歓迎です。

4

1 に答える 1

12

?問題は、OCamlの変数/関数名に疑問符文字を使用できないことです。実際には、次のように関数宣言を解析しています。

let divides ?a b =
   if a mod b = 0 then true
   else false

疑問符はa、関数の名前の一部ではなく、実際にはのタイプに影響を与えていることに注意してください。

これaは、がオプションのパラメータ'a optionであることを意味するため、一部のタイプが割り当てられ'aます。

名前から疑問符を削除してみてください。

于 2012-07-05T23:00:21.187 に答える