2011-07-26 9 views
4

Ocamlでは、部分的なタイピング情報があるかどうかを知りたいと思います。コンパイルされないプログラムのために、トップレベル/コンパイラのいくつかの既存の機能によって引き出すことができますか?私に説明させてください。部分的に推定された型情報を見ることができますか?コンパイルされないプログラムのためのOcamlトップレベル/コンパイラから?

Ocamlでは、推論された型は-annotファイルで取り出せることはよく知られています。しかし、時にはタイプミスのためにコンパイルされないコードがあります。これは、人工的な例は

# 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 

だろうコードのこの作品のプログラマは、すなわち、よくこのメッセージの第二の部分を理解しておく必要があり、このパターン

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

の、トップレベルにエクスポートエラーが発生します 「yではない」部分のために、「yはbool型が必要です」。しかし、彼女はこのエラーメッセージの第1部を理解するのが難しいかもしれません。この "y"がどのように "int"型であると推測されていますか?したがって、型の競合が発生する前に、推論型の部分集合を持つことは興味深いでしょう。上記の例では、最初の "y"( "let y = 5"から)がint型であることを通訳者に伝えたいので、2番目の "y"( "not y" )はint型であると推論されます。

ocamlインタープリタ/コンパイラで既に説明した機能がすでに提供されているかどうか教えてください。

一般的に言えば、ocaml toplevelまたはそのインタプリタは、入力エラーの原因をより効率的に見つけるためにユーザーが取り出せる部分的に推定される型を生成できますか?

この質問は、部分的に推論された型アノテーションの非一意性のため意味をなさないかもしれません。しかし、この例の例では、少なくともいくつかのケースでは、部分的に推論された型の中には、その使用法があることを示す必要があります。

ありがとうございます。

答えて

6

スイッチで生成された型注釈は、プログラムがコンパイルされなかった場合でも使用できます。コンパイラが処理した式の型が表示され、それらの中には不完全なものがあるかもしれません。これは、コンパイラが型を推論する理由を教えてくれるわけではありませんが、コンパイラがどのくらい離れているかを示し、推測されるものを調べることができます。このソースコードで例えば

let x = [(let y = 5 in not y); true];; 
  • x_a listを(コンパイラが_aを把握するために十分に得ていない)を有しています。
  • yは、タイプintです。
  • notは、タイプbool -> boolです。
  • エラーメッセージがyの第二の発生がタイプintを有することである(そして我々はそれが推定された場所を見てきた)が、コンテキストタイプboolを期待(およびnotは、その引数の型関数であるので、我々は、それを見ることができますbool)。

私はトップレベルからのこれらのタイプを確認する方法を知りませんが、あなたのコードでソースファイルを持っている場合、あなたは、ocamlc -c -annotを実行します(Emacsのような)suitable editorでソースを開いて閲覧することができますコンパイルが成功したかどうかを推論します。

関連する問題