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
F# 简化F中的记录分配#_F#_Record_Measure - Fatal编程技术网

F# 简化F中的记录分配#

F# 简化F中的记录分配#,f#,record,measure,F#,Record,Measure,假设我定义了一个模块来处理向量,其度量单位为F#: 我必须做很多类似上面的作业,所以我想知道,有没有办法简化前面的语法?比如: let my_var : Vector3<m> = { 1.0,1.0,1.0} //this don't compile let my_var : Vector3<m> = {1.0<m> ; 1.0<m> ; 1.0<m>} //this don't compile either 让my_var:Vect

假设我定义了一个模块来处理向量,其度量单位为F#:

我必须做很多类似上面的作业,所以我想知道,有没有办法简化前面的语法?比如:

let my_var : Vector3<m> = { 1.0,1.0,1.0} //this don't compile
let my_var : Vector3<m> = {1.0<m> ; 1.0<m> ; 1.0<m>} //this don't compile either
让my_var:Vector3={1.0,1.0,1.0}//这不会编译
让我的_var:Vector3={1.0;1.0;1.0}//这也不编译
我想:

  • 避免测量单位规格(
    1.0
    ),这可能吗?
    m
    不是可以从声明
    my_var:Vector3
    隐式派生出来吗
  • 避免使用记录字段名(如第二个示例中所示)。编译器本身不是可以根据顺序派生记录的字段名吗
  • 避免测量装置规格(1.0),这是否可行?m不是可以从声明my_var:Vector3隐式派生出来吗

    实际上,1.0相当于1.0,因此您不能在预期度量值不是1(无量纲)的上下文中使用它

    但是,您可以使用1.0进行推断

    避免使用记录字段名(如第二个示例中所示)。编译器本身不是可以根据顺序派生记录的字段名吗

    我能想到的最接近的事情是:

    type Vector3<[<Measure>] 'a> =
        val X : float<'a>
        val Y : float<'a>
        val Z : float<'a>
        new(x, y, z) = { X = x; Y = y; Z = z }
    
    类型向量3
    瓦利:浮子
    新的(x,y,z)={x=x;y=y;z=z}
    
    然后可以这样使用:

    let my_var = Vector3<m>(1.0<_>, 1.0<_>, 1.0<_>)
    
    让my_var=Vector3(1.0,1.0,1.0)
    
    我认为您不需要自己为变量指定类型,让F来进行类型推断。因此,下面的声明就足够了:

    let my_var = {X = 1.0<m> ; Y = 1.0<m> ; Z = 1.0<m>}
    
    my_var={X=1.0;Y=1.0;Z=1.0}
    
    如果您不想指定记录字段名(我认为让您的程序变得清晰很好),可以将记录更改为类(如@Tarmil的答案)或不相交的并集。就个人而言,我更喜欢不相交的并集,因为我仍然可以轻松地在模式匹配中使用它们:

    type Vector3<[<Measure>] 'a> = Vector3 of float<'a> * float<'a> * float<'a>
    
    let my_var1 = Vector3(1.0, 1.0, 1.0) // Vector3<1>
    let my_var2 = Vector3(1.0<m>, 1.0<_>, 1.0<_>) // Vector3<m>
    
    类型Vector3*float
    让my_var1=Vector3(1.0,1.0,1.0)//Vector3
    让my_var2=Vector3(1.0,1.0,1.0)//Vector3
    
    但是,不相交并集的不便之处在于,您不能使用点表示法访问单个字段。通过使用类并为其编写活动模式,您可以两全其美,但这开始需要大量代码,因此如果要编写许多此类类型,您可能不想这样做。
    let my_var = {X = 1.0<m> ; Y = 1.0<m> ; Z = 1.0<m>}
    
    type Vector3<[<Measure>] 'a> = Vector3 of float<'a> * float<'a> * float<'a>
    
    let my_var1 = Vector3(1.0, 1.0, 1.0) // Vector3<1>
    let my_var2 = Vector3(1.0<m>, 1.0<_>, 1.0<_>) // Vector3<m>