【问题标题】:Can I define a function that is generic across the measure dimension?我可以定义一个跨度量维度通用的函数吗?
【发布时间】:2014-08-23 23:51:45
【问题描述】:

我希望能够生成特定范围的随机数,这些随机数是 <'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?

如何编写跨度量通用的方法/函数?

【问题讨论】:

  • 您需要使用Int32WithMeasure 将普通的ints 转换为int&lt;'T&gt;
  • 怎么样?尝试签名中的哪一个?
  • Int32WithMeasure 是一个函数 - 使用 GenericOne 作为参数

标签: f# units-of-measurement


【解决方案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> ...

否则编译器期望它是一个常规的泛型类型参数。但我通常更喜欢让类型推断来处理函数是泛型的事实。

【讨论】:

  • +1 有了这个,我可以从函数定义中删除除 System.Random 之外的所有类型注释和类型。
猜你喜欢
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多