我希望能够生成特定范围的随机数,这些范围是<'T>
可能为[<Measure>] type X
或[<Measure>] type Y
let GenerateLine<'T> (rnd:System.Random, min:int<_>, max:int<_>) : (int<_> * int<_>) =
let v1:int< 'T > = rnd.Next(int(min),int(max)+1)
let v2:int< 'T > = rnd.Next(int(min),int(max)+1)
(v1,v2)
我也在inline
let
关键字尝试了相同的操作
和
let GenerateLine (rnd:System.Random, min max) =
let v1 = rnd.Next(min,max+1) * LanguagePrimitives.GenericOne
let v2 = rnd.Next(min,max+1) * LanguagePrimitives.GenericOne
(v1,v2)
也
let GenerateLine< ^T> (rnd:System.Random, min:< ^T >, max:< ^T > ) =
但我似乎没有弄清楚这一点或遵循类似的事情背后的逻辑 How to write a function for generic numbers?
如何编写跨度量通用的方法/函数?
答案 0 :(得分:1)
以下是我在评论中的意思:
let GenerateLine (rnd:System.Random, min:int<'t>, max:int<'t>) : (int<'t> * int<'t>) =
let v1 = rnd.Next(int(min),int(max)+1) |> LanguagePrimitives.Int32WithMeasure
let v2 = rnd.Next(int(min),int(max)+1) |> LanguagePrimitives.Int32WithMeasure
(v1,v2)
我已经移动了一些你的注释,但你可以坚持你所拥有的。一个关键的问题是,如果要为函数提供显式泛型参数,则需要使用Measure
属性对其进行标记:
let GenerateLine<[<Measure>]'t> ...
或者编译器期望它是常规泛型类型参数。但我通常更喜欢让类型推断处理这个函数无论如何都是通用的事实。