f# - 如何在 SRTP 类中覆盖 ToString()
问题描述
我在创建一个通用数学类时遇到问题(这里是一个非常小的示例代码,一个类型为 Vector 的类),但是,它的值不限于一个单一的数值数据类型,而是^F
用作静态解析类型参数,我期望它是用户用来实例化类的任何东西,例如int
but 也BigRational
or MyCustomNumber
,只要它遵守约束。
type Vector< ^F> (_values : ^F []) =
let values = _values
member inline __.Dimension = Array.length values
member inline __.Item with get i = values.[i + 1]
static member inline ( * ) (a: Vector< ^F>) (scalar: ^F) =
Vector< ^F>(Array.init (a.Dimension) (fun i -> values.[i] * scalar)
override inline __.ToString() = "{" + (values.ToString()) + "}" // <--- problem-line
我现在对这段代码的问题是,我仍然不知道如何正确覆盖该Object.ToString()
方法(如何实现 IComparable 也是如此,我相信我可以以同样的方式修复它)。
这真的可能吗?
提前谢谢了!
解决方案
- 不要用类型参数注释算术运算符的参数,它们会被推断出来的
- 将算术运算符的参数作为元组传递
- 在算术运算符的实现中关闭括号
- 用属性替换
let
-bound 值values
输入向量<'F> (_values : 'F[]) = 成员 val 值 = _values 成员内联 me.Dimension = Array.length me.Values 成员内联 me.Item 与 get i = me.Values.[i + 1] 静态成员内联 ( * ) (a: Vector<_>, scalar) = Vector<_>(Array.init (a.Dimension) (fun i -> a.Values.[i] * scalar)) 覆盖 me.ToString() = "{" + (me.Values.ToString()) + "}"
推荐阅读
- swiftui - SwiftUI - 具有全屏模式的 PresentationButton
- sql - Spring Data JPA:CriteriaQuery 为每个唯一外键获取具有最大值的实体
- .htaccess - 如何使用 TYPO3 v9 重定向旧文件 url
- vb.net - 表单加载时“不支持给定路径的格式”,
- joomla - 更新Joomla3.9项目中不同环境的数据库
- arrays - Vuejs:如何创建一个观察项目列表的计算属性?
- javascript - 从 indexeddb 在 React Progressive Web 应用程序中同步离线数据
- c++ - Linux/ALSA:帧写入声卡时的回调
- vb.net - 从 Chrome 中提取的 XPath 仅适用于 .NET 中的第一个 TR 元素
- django - 用于更新博客文章的按钮