假设我定义了一个模块来处理带有F#中度量单位的向量:
module Vec
[<Measure>]
type m
type Vector3<[<Measure>] 'a> =
{
X : float<'a>
Y : float<'a>
Z : float<'a>
}
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个变量,let持有一个Vector3.我可以这样做:
let my_var : Vector3<m> = {X = 1.0<m> ; Y = 1.0<m> ; Z = 1.0<m>};
Run Code Online (Sandbox Code Playgroud)
我必须做很多像上面那样的任务,所以我想知道,有没有办法简化以前的语法?就像是:
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
Run Code Online (Sandbox Code Playgroud)
我想要:
1.0<m>),这可能吗?m宣言中没有明确的推导 my_var : Vector3<m>?我不认为你需要自己为变量指定类型,让F#做类型推断.所以下面的声明就足够了:
let my_var = {X = 1.0<m> ; Y = 1.0<m> ; Z = 1.0<m>}
Run Code Online (Sandbox Code Playgroud)
如果你不希望指定记录的字段名(我认为这是很好的使你的程序清楚),您可以将记录更改为类(像@ 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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
208 次 |
| 最近记录: |