如何使用 printf 自定义自定义类型的输出?

2024-04-25

我已经阅读了很多内容专家 F#并正在致力于构建一个实际的应用程序。在调试时,我已经习惯了传递这样的 fsi 命令,以使 repl 窗口中的内容清晰可见:

fsi.AddPrinter(fun (x : myType) -> myType.ToString())

我想扩展它以与 printf 格式化程序一起使用,这样我就可以输入例如

printf "%A" instanceOfMyType 

并控制自定义类型的输出。这本书暗示这是可以做到的(第 93 页,“通用结构格式化可以扩展到任何用户定义的数据类型, F# 网站上涵盖的主题”),但我没有找到任何关于如何实际实现这一目标的参考资料。有人知道如何实现吗?这可能吗?

Edit:

我应该包含一个代码示例,它是我正在处理的记录类型,例如

type myType = 
    {a: int}        
    override m.ToString() = "hello"

let t = {a=5}
printfn "%A" t
printfn "%A" (box t)  

两个打印语句都会产生:

{a = 5;}

看起来在 F# 2.0 中执行此操作的正确方法是使用StructuredFormatDisplay http://msdn.microsoft.com/en-us/library/ee370334.aspx属性,例如:

[<StructuredFormatDisplay("hello {a}")>]
type myType = {a: int}

在本例中,不是默认的{a = 42;},你会得到hello 42.

这对于对象、记录和联合类型的工作方式相同。尽管模式必须是以下格式"PreText {PropertyName} PostText" (PreText and PostText是可选的),这实际上比ToString()因为:

  1. PropertyName可以是任何类型的属性。如果它不是字符串,那么它也将受到结构化格式化的影响。唐·赛姆的博客 http://blogs.msdn.com/b/dsyme/archive/2010/01/08/some-tips-and-tricks-for-formatting-data-in-f-interactive-and-a-in-sprintf-printf-fprintf.aspx给出了以这种方式递归格式化树的示例。

  2. 它可能是一个经过计算的属性。所以你实际上可以得到ToString()为记录和联合类型工作,尽管是以一种相当迂回的方式:

    [<StructuredFormatDisplay("{AsString}")>]
    type myType = 
        {a: int}
        override m.ToString() = "hello"
        member m.AsString = m.ToString()  // a property that calls a method
    

顺便一提,ToString()如果您调用,将始终使用(即使对于记录和联合类型)printfn "%O"代替printfn "%A".

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 printf 自定义自定义类型的输出? 的相关文章

  • F# 有异步验证库吗?

    我在代码中经常使用 asyncResult 但它会在第一个错误时退出 asyncResult let a allGood let b thisReturnsError let c neverExecuted 但有时我想执行所有函数并总结错误
  • 在没有正确原型的情况下调用 printf 是否会引发未定义的行为?

    这个看起来无辜的程序是否会调用未定义的行为 int main void printf d n 1 return 0 是的 调用printf 没有适当的原型 来自标准头
  • .NET 4 自旋锁

    以下测试代码 F 未返回我期望的结果 let safeCount let n 1000000 let counter ref 0 let spinlock ref lt SpinLock false let run i0 i1 for i
  • 使用 print_r 或 php 中的任何其他函数打印多个数组

    我需要在代码中打印多个数组的内容 例如 function performOp n inputArr workArr printf Entered function value of n is d n print r inputArr pri
  • 向 printf 传递太多参数

    任何已经工作了一周以上的 C 程序员都遇到过因调用而导致的崩溃printf格式说明符多于实际参数 例如 printf Gonna s and s s crash burn 然而 当你通过时 是否会发生类似的糟糕事情 too manyprin
  • 格式化整数时 printf 中的精度字段

    当我执行这两行时 printf 5d n 3 use of precision filed printf 05d n 3 use of 0 flag to prepend with 0 我得到以下输出 00003 00003 结果相同 所以
  • 如何在 F# 列表和 F# 元组之间进行转换?

    有没有办法在 F List 和 F Tuple 之间进行转换 例如 1 2 3 gt 1 2 3 1 2 3 4 gt 1 2 3 4 我需要两个函数来做到这一点 let listToTuple list let tupleToList t
  • 如何在 x 轴上显示每个元素的标签?

    我有包含文件名和编号的元组序列 我想绘制柱形图 其中 X 轴上有文件名 我的问题是现在 X 轴下仅显示 3 个标签 文件名 这可能是因为屏幕无法容纳更多内容 还是X轴间隔错误 如何让图表显示所有文件名 也许有办法将这些标签逆时针旋转 90
  • F# 中使用抽象类还是接口?

    从 C 背景开始摸索 F 在 C 中 决定何时使用接口和何时使用抽象类有明显的区别 在 F 中 我发现两者几乎合而为一 我知道 就 CLR 而言 F 中的做法与 C 中的做法相同 但是在 F 中编程时使用的 最佳实践 是什么 我应该完全避免
  • F# 中序列的递归函数

    这是一个相当微不足道的问题 但快速的谷歌搜索并没有给我答案 为序列编写递归函数的标准方法是什么 对于列表 您可以使用空列表和头 尾模式进行模式匹配 序列的等效项是什么 没有标准的方法可以做到这一点 因为您很少为序列编写递归函数 您应该查看各
  • sprintf 风格字符串格式化的起源

    字符串格式化概念见sprintf如今几乎可以在任何语言中找到 你知道 用 s d f 等掩盖字符串 并提供变量列表来填充它们的位置 哪种语言最初具有提供此功能的库函数或语言结构 请指定某种来源参考以确认您的主张 以便我们避免纯粹的猜测或猜测
  • 使用 OpenMP 时无用的 printf 没有加速

    我刚刚编写了第一个 OpenMP 程序 它并行化了一个简单的 for 循环 我在双核机器上运行代码 发现从 1 个线程变为 2 个线程时速度有所提高 然而 我在学校 Linux 服务器上运行相同的代码并没有看到加速 在尝试了不同的事情之后
  • 如何在 C++ 中的特定坐标处将字符串打印到控制台?

    我正在尝试在控制台中的指定坐标处打印字符 到目前为止我一直在使用非常丑陋的printf 033 d dH s n 2 2 str 但我只想问 C 是否有其他方法可以做到这一点 问题甚至不在于它丑陋 当我试图让自己成为一个更漂亮的函数时 问题
  • printf 字符串,可变长度项

    define SIZE 9 int number 5 char letters SIZE this wont be null terminated char fmt string 20 sprintf fmt string d ds SIZ
  • F# 参数传递

    我一直认为 F 有两种不同的方式来传递参数 柯里化风格和元组风格 这实际上是正确的吗 是不是很简单一种风格 柯里化风格和参数可以是简单值或元组 e g someFunc a b 这不是一个函数吗one咖喱风格的参数恰好是一个元组 因此允许我
  • 何时在 F# 中使用区分联合与记录类型

    在继续讨论复杂的示例之前 我试图先弄清楚 F 的基础知识 我正在学习的材料介绍了区分联合和记录类型 我已经审阅了两者的材料 但我仍然不清楚为什么我们要使用其中之一而不是另一个 我创建的大多数玩具示例似乎都可以在两者中实现 记录似乎非常接近我
  • 在 IEnumerable 上使用 Seq 函数 [重复]

    这个问题在这里已经有答案了 我正在尝试在 IEnumerable 上应用 Seq 函数 更具体地说 它是System Windows Forms HtmlElementCollection它实现了ICollection and IEnume
  • 通用高阶函数

    当我将泛型函数作为本地值传递时 但在作为参数传递时却不能使用具有不同类型参数的泛型函数时 是否有原因 例如 let f id let g x y f x f y g 1 2 工作正常 但如果我尝试将函数作为参数传递 let g f x y
  • 管道序列中的异常处理

    我正在开发一个基本的 2D CAD 引擎 管道操作符显着改进了我的代码 基本上 有几个函数从空间中的点 x y 开始 并在多次移动操作后计算最终位置 let finalPosition startingPosition gt moveByL
  • 字符串格式化表达式 (Python)

    字符串格式化表达式 This is d s example 1 nice 字符串格式化方法调用 This is 0 1 example format 1 nice 我个人更喜欢方法调用 第二个示例 以提高可读性 但由于它是新的 因此随着时间

随机推荐

  • 如何在 C# 中异步读取结束进程输出?

    我在 C 中异步读取一个进程的输出时遇到问题 我在这个网站上发现了一些其他类似的问题 但它们并没有真正帮助我 这是我所做的 制定新流程 设置启动信息 文件名 参数 CreateNoWindow true UseShellExecute fa
  • Spark 中的默认分区方案

    当我执行以下命令时 scala gt val rdd sc parallelize List 1 2 3 4 3 6 4 partitionBy new HashPartitioner 10 persist rdd org apache s
  • 如何在 SQL Server 中使用 RANK()

    我使用时遇到问题RANK https msdn microsoft com en us library ms176102 aspx在 SQL Server 中 这是我的代码 SELECT contendernum totals RANK O
  • 使用 Json.format 没有可用的 MyClass 隐式格式

    在 Json format 上使用复杂对象作为另一个对象的属性时出现错误 我有两节课 RoleDTO and 电子邮件邀请DTO 电子邮件邀请DTO has a RoleDTO 所以 我宣布 case class RoleDTO id Op
  • Java正则表达式匹配除

    匹配除特定字符之外的所有字符的正确语法是什么 例如我想匹配除字母之外的所有内容 A Z a z 和数字 0 9 I have string matches A Z a z 0 9 这是不正确的吗 是的 你不需要嵌套 像那样 使用这个代替 A
  • 根据情况启动docker容器

    Problem 我有一个包含 6 个服务的 docker compose yml 当我执行 docker compose up 时 所有 6 个容器都会启动 但我需要 2 个容器来最初开始工作 并根据条件休息 4 个容器 描述 组合中的 6
  • OpenCL 矩阵乘法应该更快?

    我正在尝试学习如何使 GPU 优化 OpenCL 内核 我以使用本地内存中的方形图块进行矩阵乘法为例 然而在最好的情况下 我只得到了约 10 倍的加速 约 50 Gflops 与 numpy dot 相比 5 Gflops 它使用的是 BL
  • 如何使这两个事件的代码简短

    我有以下代码 我怎样才能使它简短 以便它可以通过单击并输入来工作 这样我就不必重复它 document ready function document keypress function e if e which 13 form myfor
  • 如何将存储值分配给隐藏字段

    我有一个模型和商店 我需要为商店中的隐藏字段分配一个值 Ext define loginUser extend Ext data Model fields name id mapping Provider id name name mapp
  • 这个计算Code128条码校验位的代码正确吗?

    根据我对 Code128 条形码 与大多数其他标准条形码类型截然不同 的校验位计算的理解 我下面的代码是正确的 然而 我希望那些可能更了解 有一些经验观察 来自附着在风衣 或实验室 外套上的战壕泥的人进行 健全性检查 这是我的理解 条形码中
  • AngularJs 和 ASP.NET MVC 5 - ng-model 覆盖文本框值

    我有一个使用 ASP NET MVC 5 构建的表单 Html TextBoxFor用我的模型填充表单 例如 在表单导航或服务器端验证失败之后 我现在引入了使用 Angular 的客户端地址查找 这意味着一些表单字段现在用ng model启
  • 如何在R中的approxfun()之后根据y值输入估计x值[重复]

    这个问题在这里已经有答案了 我想用approxfun或类似的方法来估计曲线的函数 然后估计x一个点的值将被赋予一个已知的y value 这是一个简化的示例 y lt seq from 1 to 10 by 1 x lt seq from 0
  • 实体框架的审计跟踪

    我在每个表中都有审计跟踪字段 InsertedBy InsertedDate UpdatedBy 和 UpdatedDate 我构建解决方案以通过覆盖 savechange 来减少冗余 public override int SaveCha
  • 我应该把我的 Hugo 网站图标放在哪里

    我正在使用 Hugo 生成静态站点 我应该把我的favicon ico file 将图标放入静态目录中 静态目录位于hugo 站点的根目录中 当您生成网站时 网站图标将被复制到public 生成站点的根
  • 使用 ffmpeg 转换真实媒体

    我有许多旧的硬壳真实媒体文件需要转换 并希望编写一个脚本来批量处理它们 我可以使用 FFMpegX 进行 Real Media gt AVI 转换 但是当我尝试使用 ffmpeg 复制转换时 它总是会出现如下错误 avi 0x10084fa
  • 用户状态(秒差距)

    我正在使用秒差距解析一个表达式 并且我想使用秒差距中的用户状态来跟踪这些表达式中的变量 不幸的是我真的不知道该怎么做 给出以下代码 import Data Set as Set inp x y z data Var V String var
  • django 在我的机器上非常慢

    我全新安装了 django 1 0 并提供了一个简单的页面 需要 5 秒才能加载 在我同事的计算机上几乎不需要时间 我使用启动服务器 python manage py testserver 我可以看到每个 GET 请求 PNG 和样式表 大
  • NodeJS 获取承诺回调挂起

    我有这个代码 fetch url then response gt const json response json console log simplest possible fetch json json where 在控制台中我得到
  • Visual Studio 中用于在 Windows 文件资源管理器中打开解决方案的快捷方式?

    Visual Studio 当前使用2013 中是否有键盘快捷键可以在Windows文件资源管理器中打开解决方案 或项目 目前 我通常必须打开解决方案资源管理器 右键单击我的解决方案或项目 然后向下滚动到 在文件资源管理器中打开文件夹 但这
  • 如何使用 printf 自定义自定义类型的输出?

    我已经阅读了很多内容专家 F 并正在致力于构建一个实际的应用程序 在调试时 我已经习惯了传递这样的 fsi 命令 以使 repl 窗口中的内容清晰可见 fsi AddPrinter fun x myType gt myType ToStri