Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Interface 测量单位、接口和混合_Interface_F#_Mixins_Units Of Measurement - Fatal编程技术网

Interface 测量单位、接口和混合

Interface 测量单位、接口和混合,interface,f#,mixins,units-of-measurement,Interface,F#,Mixins,Units Of Measurement,考虑以下F#代码: type线性= 接口 结束 分型光度计= 接口 结束 []类型cm= 界面线性 界面光度法 []类型m= 界面线性 界面光度法 []类型时间 我想将这些接口用作对度量类型进行分组的一种方式,以及允许“任何度量”和“特定度量”之间具有一定程度的通用性的一种方式,类似于: (* Yes, I know this syntax is probably incorrect *) let rate (distance:float<'u:#ILinear,#IMetric

考虑以下F#代码:

type线性=
接口
结束
分型光度计=
接口
结束
[]类型cm=
界面线性
界面光度法
[]类型m=
界面线性
界面光度法
[]类型时间
我想将这些接口用作对度量类型进行分组的一种方式,以及允许“任何度量”和“特定度量”之间具有一定程度的通用性的一种方式,类似于:

(* Yes, I know this syntax is probably incorrect *)    
let rate (distance:float<'u:#ILinear,#IMetric>) (time:float<time>) =
       distance/time
(*是的,我知道这个语法可能不正确*)

let rate(距离:float我认为这是不可能的,但我非常喜欢这个想法:-)

如果可能的话,那么这些约束可能会使用与编写普通(非度量)类型参数的接口约束相同的语法编写:

let rate<[<Measure>] 'u when 'u :> IMetric> (distance:float<'u>) (time:float<time>) =
    distance/time
由于不能在单元类型上指定约束,因此必须在第二个类型参数上指定它们。然后,您可以使用以下命令调用该函数:

rate (cm 10.0) 5.0<time>
速率(cm 10.0)5.0

我尝试了“u when”u:>IMetric语法,正如您所说,它会吐出来。:-)我意识到这是一种“突破极限”,可能远远超出了最初的设计意图,但正如我所说的,这个想法是允许在完全开放的“任何度量单位”和特定度量单位之间存在某种差异。
[<Struct>]    
type FloatValue<[<Measure>] 'u, 'constr>(value:float<'u>) =
  member x.Value = value

let cm f = FloatValue<_, IMetric>(f * 1.0<cm>)
let rate (distance:FloatValue<'u, #IMetric>) (time:float<time>) =
  distance.Value / time
rate (cm 10.0) 5.0<time>