是否可以通过F#中的度量单位标记创建区分联合?

Pet*_*ner 3 f# units-of-measurement discriminated-union

是否可以通过F#中的测量单位标签创建区分联合类型?

我想写... 如下:

type DomainObject =
| Pixel           of int
| ScaledPixel     of int
| Centimeter      of float
| Unset

let var1 = 10<px> // should equal: let var1 = Pixel(10)
let var2 = 0<us>  // should equal: let var2 = Unset

let process sth =
  match sth with
  | Pixel(p) -> ...
  | Centimeter(c) -> ...
  // etc.
Run Code Online (Sandbox Code Playgroud)

使用NumericLiterals这样的事情是可能的.但是,人们只能使用Neil P.表示的少量文字.

Tom*_*cek 5

正如我在评论中所说,简单的答案是否定的.

在某种程度上,您试图滥用一个F#功能(度量单位)来模拟其他语言(后缀运算符)中可能存在的功能,这可能是一件坏事,因为(即使它有可能),结果代码会很混乱.

如果您只想反转参数的顺序以使数字位于单元名称之前,则可以使用管道运算符并写入:

let var1 = 10 |> Pixel
let var2 = Unset
Run Code Online (Sandbox Code Playgroud)

这基本上为您提供了一种编写"后缀运算符"的方法,但使用标准的F#惯用法.