如何在F#中使用通用计量单位指定union子句?

the*_*onk 4 generics f# discriminated-union

无论如何定义一个DU,其子句使用通用的度量单位?例如

type MyDU =
| A  of int<_>
| B  of float<_>
Run Code Online (Sandbox Code Playgroud)

此代码无法编译,但我可以指定一个常规函数,该函数接受具有通用度量单位的数值:

let f (n : int<_>) = n * n;;
val f : int<'u> -> int<'u ^ 2>
Run Code Online (Sandbox Code Playgroud)

考虑到每个union子句最终都是一个将后面指定的类型转换为of私有类型的函数,MyDU.A或者MyDU.B是否有一个特定的原因,它为什么它在函数定义而不是类型定义?

有没有办法做我想做的事情?如果没有,我很想知道它为什么不起作用!

谢谢,

Joh*_*mer 11

你需要使用通用联盟 -

type MyDU<[<Measure>] 't> =
    | A  of int<'t>
    | B  of float<'t>
Run Code Online (Sandbox Code Playgroud)

这是因为a int<m>与a 不同int<s>.

请注意,这不是特定于度量类型,它也适用于诸如使用union来创建列表等.