generics - 如何在 F# 中使用通用计量单位指定联合子句?

标签 generics f# discriminated-union

无论如何定义一个DU,其条款使用通用计量单位?例如

type MyDU =
| A  of int<_>
| B  of float<_>

此代码无法编译,但我可以指定一个常规函数,该函数接受具有通用度量单位的数值:
let f (n : int<_>) = n * n;;
val f : int<'u> -> int<'u ^ 2>

考虑到每个 union 子句最终都是一个函数,它转换 of 之后指定的类型到私有(private)类型 MyDU.AMyDU.B为什么它适用于函数定义而不适用于类型定义有什么特别的原因吗?

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

谢谢,

最佳答案

您需要使用通用联合 -

type MyDU<[<Measure>] 't> =
    | A  of int<'t>
    | B  of float<'t>

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

请注意,这并不特定于度量类型,它也适用于使用联合创建列表等。

关于generics - 如何在 F# 中使用通用计量单位指定联合子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11862162/

相关文章:

typescript - 就地修改受歧视联合对象

f# - 可区分联合中的不可变字段

scala - 使用集合来保留类型信息

java - 将泛型集合转换为数组

java 方法接受一个 T extends Number

f# - F# 中 ">>"运算符的语义

f# - 在 F# 中切片二维数组但类似于 Matlab?

reflection - 如何在 F# 中获取给定联合类型的每个联合案例的类型

c# - Xamarin Master Detail 句柄泛型

F# -> 为 HashSet<'a> 实现 IComparable