我想写一些数字代码,可以使用标量或向量(在这种情况下,分别来自DiffSharp D和DV类型)。有时候,我希望能够为使用,所以我已经定义了一个歧视工会为他们:运算符重载为歧视的联盟
type IBroadcastable =
| Scalar of D
| Vect of DV
许多运营商都已经重载这两种类型的,所以使用它们IBroadcastable
我写的代码添加像这样的联盟:
static member Exp x =
match x with
| Scalar x -> Scalar (exp x)
| Vect x -> Vect (exp x)
这似乎很多余。有什么办法可以在联合体上使用运算符,而不必为它编写新的重载?或者我应该使用不同的模式(即不是歧视的工会)?什么,我想用这种类型的一个例子:
let ll (y: IBroadcastable) (theta: IBroadcastable) = y*theta-(exp theta)
的*
和-
将有更复杂的行为(阵列广播),这是有意义的有来形容自己,但exp
操作简单,如上。这需要是一个函数,因为我希望能够部分应用y参数,使用DiffSharp获取渐变,并且相对于theta参数使其最大化。
我不明白你为什么需要这个工会。与仅在'D'或'DV'上使用操作员相比,它会给你带来什么,无论你现在手头有哪一个? –
@FyodorSoikin我想写一个函数,其中一个参数可以是任何一种类型,并且它看起来像一个联合是通常的做法。注意:如果不清楚,我是一个相当新的F#程序员。 –
你将如何使用该功能?它将如何实施?为什么你不能用这个实现来代替函数? –