歧视联合的运算符重载

2024-01-19

我正在尝试编写一些可以使用标量或向量的数字代码(在本例中分别是来自 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)

The * and -将会有更复杂的行为(数组广播),这是有必要描述我自己的,但是exp运算符很简单,如上。这需要是一个函数,因为我希望能够部分应用 y 参数,使用 DiffSharp 获取梯度,并相对于 theta 参数最大化它。


从根本上讲,由于您正在定义一个抽象,因此您需要根据该抽象来定义您的操作。这是一项成本,必须通过它在代码中其他地方为您提供的便利来抵消。

您可能想知道 F# 是否允许您在特定情况下剪切样板。除了使用function关键字,不是真的,因为两个分支实际上都在做不同的事情:绑定变量的类型x是不同的,并且您将它们包装在不同的联合箱中。如果你确实在做同样的事情,你可以这样写,例如:

type DU =
| A of float * float
| B of float * string
with
    static member Exp = function
        | A (b, _)
        | B (b, _) -> exp b // only write the logic once
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

歧视联合的运算符重载 的相关文章

  • 像 Javascript 对象一样循环遍历 F# 记录

    在 javascript 中 我可以使用简单的 for 循环访问对象的每个属性 如下所示 var myObj x 1 y 2 var i sum 0 for i in myObj sum sum myObj i 我想知道我是否可以用 F 做
  • F# 使用 while 循环

    我有一个数据读取器 我想从中返回行集合 在阅读了一天的书籍后 我无法找到在 f 中执行此操作的最佳方法 我可以在 F 中以正常的 C 方式进行操作 但这不是我使用 f 的原因 这就是我想要实现的目标 let values while rea
  • 如何从 C# 调用 F# 类型扩展(静态成员函数)

    FSharp 代码的结构如下 我无法控制源代码 namespace FS
  • 类模板上的运算符重载

    我在为模板类定义一些运算符重载时遇到一些问题 让我们以这个假设的类为例 template
  • 使用 FParsec 解析 int 或 float

    我正在尝试使用 FParsec 解析文件 该文件由 float 或 int 值组成 我面临两个问题 无法找到好的解决方案 1 Both pint32 and pfloat将成功解析相同的字符串 但给出不同的答案 例如pint32将返回3解析
  • Async.AwaitTask 在 f# 中如何工作?

    我知道 f 和 c 异步模型之间的主要区别在于 在 f 中 除非您调用 Async RunSynchronously 之类的内容 否则异步执行不会开始 在 C 中 当方法返回任务时 通常 并非总是 立即在后台线程中开始执行 Async Aw
  • 将可区分的联合传递给 InlineData 属性

    我正在尝试对一个解析器进行单元测试 该解析器解析字符串并返回相应的抽象语法树 表示为可区分的联合 我认为使用 Xunit Extensions 属性会非常紧凑InlineData将所有测试用例堆叠在一起
  • 图像分析-光纤识别

    我是图像分析新手 您知道如何以仅获取纤维的方式对该图像进行二值化吗 我尝试过不同的阈值技术等 但没有成功 我不介意应该使用什么工具 但我更喜欢 NET or Matlab PS 我不知道该把答案放在哪里 所以我把它放在StackOverfl
  • F#:如何将 Json.NET [JsonConstructor] 属性应用于主构造函数?

    我正在尝试用 F 做一些事情 比如JsonConstructorAttribute中的示例Json NET 文档 http www newtonsoft com json help html JsonConstructorAttribute
  • F#:Microsoft.FSharp.Data.TypeProviders 是否需要配置文件 47?

    这是后续我昨天的帖子 https stackoverflow com questions 30399773 f fsc error fs2024 static linking may not use assembly that target
  • 2D 矩阵和重载operator() / 丑陋的语法

    我在我的一个项目中使用二维矩阵 这就像建议的那样C 常见问题精简版 http www parashift com c faq lite operator overloading html faq 13 10 巧妙的是你可以像这样使用它 in
  • 重载算术运算符

    赋值运算符可以声明为 T 运算符 const t 在类中 但不能以这种方式定义算术运算符 它必须是友元函数 我不明白为什么 你能解释一下吗 算术运算符不必须是友元 那么你可以这样定义 MyClass MyClass operator con
  • F#:模式构成?

    我正在尝试编写一个由另外两个模式组成的模式 但我不确定如何去做 我的输入是字符串列表 文档 我有一个与文档标题匹配的模式和一个与文档正文匹配的模式 该模式应该匹配整个文档并返回标题和正文模式的结果 您可以使用以下命令一起运行两个模式 您在问
  • 使用列表匹配绑定值(没有编译器警告)

    假设我有一个需要一些时间的函数int参数 但在其中我将使用float32 我不想使用float32 i无处不在的功能 相反 我想这样做 let x float32 x let y float32 y let w float32 w let
  • 何时使用接口,何时使用高阶函数?

    给定一个具有以下层的 ASP NET MVC 应用程序 UI 视图 CSS Javascript 等 控制器 服务 包含业务逻辑和数据访问 没有单独的数据访问层的原因是我正在使用 SQL 类型提供程序 以下代码可能不起作用 因为它只是原始草
  • 非成员运算符:无法将非常量左值引用绑定到右值

    绑定一个non const rvalue to a rvalue与会员操作员一起工作 案例A 但绑定到非成员运算符 情况B 才不是 struct A A operator lt lt int i return this struct B i
  • 如何使用反射来确定 F# 联合类型是否是类似枚举的联合(每种情况下都没有字段)

    术语 在下面的文章中 我将使用术语 引用枚举 来指代 F 类型 该类型是在每种情况下都没有字段的可区分联合 例如 type AReferenceEnum Yes No Maybe 要求 我需要一个给定的函数Type 返回一个bool告诉类型
  • 是否可以使用 fparsec 解析“越位”(基于缩进)语言?

    我希望将 FParsec 用于基于缩进的类似 python 的语言 我知道这必须在词法分析阶段完成 但 FParsec 没有词法分析阶段 是否可以使用 FParsec 或者 词法分析后如何提供它 P D 我是 F 新手 但在其他语言方面经验
  • 安全重载流运算符>>

    有大量关于超载的信息operator lt lt 模仿一个toString style 方法 将复杂对象转换为字符串 我对 感兴趣also实施逆过程 operator gt gt 将字符串反序列化为对象 通过检查STL来源 我收集到 ist
  • F# 会自动内联一些函数,即使它们没有标记为“inline”,这是有意的吗?

    看起来 F 会自动内联一些函数 即使它们没有标记为 内联 let a x x 3 let b x x x let funB x y if x gt y then 3 else 1 let funC x let s a x let c fun

随机推荐