5

ocamlプロジェクトに取り組んでいるときに、よくわからないものを見つけました。

OCaml 標準ライブラリのArrayとモジュールの両方を使用しているとします。Listどちらも関数を実装していますlengthが、型が異なります。Listモジュールでは、これはそのタイプです:

length: a' list -> int

Arrayモジュールでは、次のタイプがあります。

length: a' array -> int

openしかし、キーワードを使用して、実装していた同じモジュールで両方のモジュールを使用したかったのです。

open List
open Array

リストで関数を使用しようとすると、lengthコンパイル中に型エラーが発生しました。
OCaml は強力な静的型付け言語であるため、両方を使用していると宣言したのに、リスト モジュールの長さ関数が必要であることをコンパイラが認識しなかったのはなぜでしょうか。

4

1 に答える 1

8

OCamlはそれらのタイプに基づいて1つの関数または別の関数を選択しません。

あなたが書くとき

open Array

モジュールの機能は、同じ名前Arrayのモジュールの機能をマスクしています。List後で関数を呼び出すとlength、OCamlは、という名前の関数lengthを探し、見つけArray.lengthて、この関数に互換性のあるタイプがないと文句を言います。

通常の方法は、それが必要な関数である場合、List.length(単にではなく)を呼び出すことです。length


より一般的には、OCamlには名前のオーバーロードがありません(つまり、同じ名前で引数の型が異なる2つの関数または演算子があります)。これは、型の推論がはるかに困難になるためです。

于 2012-07-31T09:02:11.867 に答える