4

Ocamlで、部分的な入力情報かどうかを知りたいです。コンパイルしないプログラムの場合、トップレベル/コンパイラの既存の機能によって描画できますか? 説明させてください。

Ocaml では、推論された型が -annot ファイルで取得できることはよく知られています。ただし、入力エラーが原因でコンパイルできないコードがある場合があります。このパターンのトップレベルにエクスポートされたエラーが発生します

"This expression has type A, but was expected type B" 

人為的な例は

# let x =  
  let y = 5  in
  not y;;
    Characters 32-33:
    not y;;
        ^
Error: This expression has type int 
       but an expression was expected of type bool

このコードのプログラマーは、このメッセージの 2 番目の部分、つまり「y は bool 型であることが期待されます」をよく理解する必要があります。これは、「y ではない」部分があるためです。ただし、このエラー メッセージの最初の部分を理解するのが難しい場合があります。この「y」はどのように「int」型であると推測されるのでしょうか。したがって、型の競合が発生する前に、推論された型の部分的なセットを持つことは興味深いでしょう。上記の例では、最初の "y" ("let y = 5" から) が int 型であることをインタープリターに伝えてほしいと思います。これにより、2 番目の "y" ("not y" から) の理由がわかります。 ) は int 型であると推測されます。

説明されている機能がすでに一部の ocaml インタープリター/コンパイラーによって提供されているかどうか教えていただけますか?

一般的な言葉で言えば、私の質問は次のとおりです: ocaml トップレベルまたはそのインタープリターは、入力エラーの原因をより効率的に見つけるために、ユーザーが取得できる部分的に推測された型を生成できますか?

部分的に推論された型注釈が一意でないため、この質問は意味をなさない可能性があります。ただし、例の例は、少なくともいくつかのケースでは、一部の部分的に推測された型にその使用法があることを示す必要があります。

アイデアありがとうございます。

4

1 に答える 1

6

-annotプログラムがコンパイルされていない場合でも、スイッチによって生成された型注釈を使用できます。コンパイラが取得した式の型が表示されますが、それらのいくつかは不完全である可能性があります。これは、コンパイラが型を推論した理由を示しているわけではありませんが、コンパイラがどこまで進んだかを示しており、推論した内容を調べることができます。

たとえば、次のソース コードを使用します。

let x = [(let y = 5 in not y); true];;
  • x型を持っています_a list(コンパイラは を理解するのに十分な距離を置いていません_a)。
  • yタイプを持っていintます。
  • notタイプを持っていbool -> boolます。
  • エラー メッセージは、 の 2 番目の出現にyは型がありますint(そして、それが推論された場所を見てきました) が、コンテキストは型を期待しているということです(そして、は引数の型が である関数なboolので、それを見ることができます)。notbool

トップレベルからこれらの型を確認する方法はわかりませんが、コードを含むソース ファイルがある場合は、 を実行し、適切なエディター(Emacs など) でocamlc -c -annotソースを開き、コンパイルが成功したかどうかの推定型を表示できます。か否か。

于 2011-07-26T18:58:18.567 に答える