F# 简化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
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
隐式派生出来吗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>