2

如何打印带有单位的数字?我应该使用“%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'
4

2 回答 2

3

如果您想为您hr的度量单位输入强类型,您可以使用“%a”。

printf "%a"需要一个函数,其中第一个参数是 a TextWriter,第二个参数是您指定的任何值。使用这将允许您将 requireint<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    
于 2013-10-02T05:11:34.363 回答
2

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

于 2013-10-02T06:24:53.070 回答