測定単位に厳密な型付けが必要な場合はhr
、"%a" を使用できます。
printf "%a"
は、最初のパラメーターが aTextWriter
で、2 番目のパラメーターが指定した任意の値である関数を想定しています。int<hr>
これを使用すると、コンパイル時に型チェックを提供する 2 番目の引数としてrequire を使用できます。
以下のコードを見てください。
open System.IO
[<Measure>] type hr
let printHours (tw:TextWriter) (hours:int<hr>) =
tw.Write("{0} hour(s)", hours)
あなたの質問の例は次のように書かれます:
let a = 10<hr>
printf "%a" printHours a
これにより、コンソールに10 時間が表示されます。
単位を持たない値を渡すとhr
、素敵なエラーが発生します。
printf "%a" printHours 10;;
printf "%a" printHours 10;;
-----------------------^^
error FS0001: This expression was expected to have type
int<hr>
but here has type
int