热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

F#Interactive中的数据格式化技巧:使用AddPrinter和AddPrintTransformer自定义输出

本文探讨了如何在F#Interactive(FSI)中通过AddPrinter和AddPrintTransformer方法自定义类型(尤其是集合类型)的输出格式,提供了详细的指南和示例代码。
在 F# 编程中,有时我们需要改变某些类型在 FSI 中的默认输出格式,特别是对于集合类型。本文将介绍几种方法来实现这一目标,并提供具体的代码示例。

### 使用 AddPrintTransformer 和 AddPrinter

一个简单的方法是使用 `fsi.AddPrintTransformer` 来生成对象的替代显示形式,或者使用更小的 `fsi.AddPrinter` 函数直接生成字符串表示。例如:

```fsharp
type C(elems: int list) =
member x.COntents= elems
member x.IsBig = elems.Length > 100

let c = C [1; 2; 3]
fsi.AddPrintTransformer (fun (c:C) -> box c.Contents)
```

这会使得 `c` 的输出为 `[1; 2; 3]`。

`AddPrintTransformer` 的优点是可以根据条件返回 `null` 来忽略格式化器,例如:

```fsharp
fsi.AddPrintTransformer (fun (c:C) -> if c.IsBig then null else box c.Contents)
```

此外,你还可以对任意对象进行特定格式化:

```fsharp
fsi.AddPrintTransformer (fun (obj: obj) -> match obj with :? C as c -> box c.Contents | _ -> null)
```

### 使用 StructuredFormatDisplayAttribute

如果你希望更改 `sprintf`、`printf` 等函数中的 `%A` 行为,可以使用 `StructuredFormatDisplayAttribute` 属性。例如:

```fsharp
[]
type C(elems: int list) =
member x.COntents= elems

let c = C [1; 2; 3]
```

这会使得 `c` 的输出为 `CCC [1; 2; 3]`。

### 针对不同类型的最佳实践

- **普通集合类**:使用列表或序列作为替代对象。
- **矩阵或表格类型**:使用二维数组作为替代对象。
- **联合类型**:考虑使用辅助联合类型来解开抽象边界。
- **递归树型数据**:描述子树为列表。

例如,对于递归树型数据:

```fsharp
[]
type Tree(node: int, elems: Tree list) =
member x.COntents= (node, elems)

let c = Tree(1, [Tree(2, []); Tree(3, [Tree(4, [])])])
let c2 = Tree(1, [c; c])
let c3 = Tree(1, [c2; c2])
```

### 其他建议

为了提高调试体验,还应考虑实现 `ToString` 方法,并为 VS 调试器添加 `DebuggerDisplay` 属性。

参考资料:
- [DSyme 博客](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)
- [CNBlog 文章](https://www.cnblogs.com/tryfsharp/archive/2011/12/31/2308486.html)
推荐阅读
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • Linux环境下C语言实现定时向文件写入当前时间
    本文介绍如何在Linux系统中使用C语言编程,实现在每秒钟向指定文件中写入当前时间戳。通过此示例,读者可以了解基本的文件操作、时间处理以及循环控制。 ... [详细]
  • 本文详细介绍了流编辑器sed中的G、H、g、h命令,探讨了它们的工作原理及应用场景。通过实例解析和图解分析,帮助读者掌握这些高级命令的使用方法。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 在PHP后端开发中遇到一个难题:通过第三方类文件发送短信功能返回的JSON字符串无法解析。本文将探讨可能的原因并提供解决方案。 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • 二叉树的链表实现
    本文介绍了一种使用链表结构表示二叉树的方法。通过定义节点结构和相关操作函数,可以方便地创建、插入和遍历二叉树。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 本文将详细介绍如何在没有显示器的情况下,使用Raspberry Pi Imager为树莓派4B安装操作系统,并进行基本配置,包括设置SSH、WiFi连接以及更新软件源。 ... [详细]
  • SpringMVC RestTemplate的几种请求调用(转)
    SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文旨在探讨如何利用决策树算法实现对男女性别的分类。通过引入信息熵和信息增益的概念,结合具体的数据集,详细介绍了决策树的构建过程,并展示了其在实际应用中的效果。 ... [详细]
  • HDU 2871 内存管理问题(线段树优化)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871。本题涉及内存管理操作,包括重置、申请、释放和查询内存块。通过使用线段树进行高效管理和维护。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
author-avatar
手机用户2502933677
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有