2012-03-22 4 views
2

どのようなタイプでも印刷できるprint文を作成しようとしています。私はこれを達成するためにタイプパターンマッチングを使用したいと思います。F#より良いprintfを作成しようとしています

これは動作しません:

let print x = match x with | :? int -> printf "INT"; | _ -> None;; 

私はメッセージを取得:

が持つプリントのx =一致xを聞かせします| :? int - > printf "INT"; | _ - >なし;;
----------------------------- ^^^^^

stdin(47,30):エラーFS0008 : タイプ 'から intへのこの実行時強制またはタイプテストには、このプログラムポイントより前の情報に基づく不定型が関係します。実行時型テストは、一部の型では許可されていません。 追加の注釈が必要です。

私はint型のマッチングを行うことができませんか?タイプ・マッチングを実行できない他のタイプはどれですか?それ以上の型の注釈が必要なことは何を意味していますか?

+1

これは、これまで与えてきたコードから "x"のタイプを推論することはできません。パッドの答えは修正でなければなりません。つまり、印刷のマスクとして "%A"を実行するだけです。 –

+1

@ Onorioのコメントをより明確にするために、作成しようとしている関数が既に存在しています: 'printfn"%A "x'。 – Benjol

答えて

6

タイプテストは参照タイプでのみ実行されます。したがって:

let print x = 
    match box x with 
    | :? int -> printf "INT" 
    | _ ->() 

または

let print (x: obj) = 
    match x with 
    | :? int -> printf "INT" 
    | _ ->() 

が働くだろう。

unitタイプprintf "INT"とは異なるタイプがoptionタイプであるため、機能にチェックが入っていないことに注意してください。