F#中单位的数字(值)的格式占位符是什么?

时间:2013-10-02 04:39:52

标签: f#

如何用单位打印数字?我应该使用“%A”还是先拆掉装置? MSDN没有说什么:http://msdn.microsoft.com/en-us/library/vstudio/ee370560.aspx

[<Measure>] type hr
let a = 10<hr>

printf "%d" a // <-- doesn't compile: Unit of measure 'hr' doesn't match the unit of measure '1'

2 个答案:

答案 0 :(得分:3)

如果您希望对hr计量单位进行强力打字,可以使用“%a”。

printf "%a"需要一个函数,其中第一个参数是TextWriter,第二个参数是您指定的任何值。使用它将允许您需要int<hr>作为第二个参数,它将在编译时提供类型检查。

看看下面的代码:

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    

答案 1 :(得分:2)

我可能会printf "%O hour(s)" aint a |> printf "%i hour(s)"。一种是类型安全的,一种是短的。