当选项的值为“None”时动态确定选项的类型

2023-12-22

动态获取 Option 类型有一些困难。假设我有一个函数:

let printType x =
   if (box x) = null then printfn "the type is 'null'"
   else printfn "the type is %A" (x.GetType())

我们这里有输出:

printType 3          // the type is System.Int32
printType (Some(3))  // the type is Microsoft.FSharp.Core.FSharpOption`1[System.Int32]
printType None       // the type is null
printType null       // the type is null

获取表达式类型时如何区分 None 和 null?


在运行时,选项None值表示为null因此您无法确定它们的运行时类型。但是,您可以编写一个通用函数来打印选项的静态类型:

let printType (x:'T option) =
  printfn "Static type is: %s" (typeof<'T>.Name)

根据您的需要,这可能会也可能不会满足您的需要。

printType (None : int option)     // Int32
printType (None : string option)  // String 
printType None                    // Object (the default used by the inference)

EDIT如果您希望能够对任何参数调用该函数,您可以使用typeof<'T>正如我的示例以及马修解决方案中的其余逻辑一样。以下代码与 Matthew 的代码片段执行相同的操作(但它不会无缘无故地创建引用):

let printType (x:'T) =
  let typeOfX = typeof<'T>
  if not <| FSharpType.IsUnion(typeOfX) && (box x) = null then 
    printfn "Static type is %s, but the value is 'null'" typeOfX.Name
  else 
    printfn "Static type is %s and value is not 'null'" typeOfX.Name
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当选项的值为“None”时动态确定选项的类型 的相关文章

随机推荐

  • 在jquery中获取外部url的html

    如何使用 jquery 获取外部 URL 的 HTML 简短的回答是你不能 因为 AJAX 请求被限制在相同的 子 域和端口上 同源政策 https developer mozilla org En Same origin policy f
  • Robocopy 后,复制的目录和文件在目标驱动器上不可见

    我很高兴使用 robocopy 将我的计算机备份到外部 USB 驱动器 这很棒 因为它只复制已更改 更新 新的文件 我可以将外部驱动器带到任何机器上并查看它 就像它是计算机上的另一个驱动器一样 我最近购买了一个 750g 和另一个 1tb
  • CoreMotion 在后台状态更新

    借助最新 iOS 设备中的 M7 芯片 当用户使用 CMMotionActivityManager 从静止状态变为跑步 行走等时 可以通过编程方式获得通知 Stava 和 Runkeeper 都用过这个自动暂停 GPS 轮询 http gi
  • 如何从另一个页面控制viewPages页面

    我有一个ViewPager共 3 页listView在每个页面中 我想要动画listView以某种方式 当用户水平滑动下一页时 listView应该根据下一页的宽度来 即第一个项目应该完全推入 第二个应该是可见的一半 口渴应该是第二个可见的
  • 如何在 Material UI 5 中使用 useTheme?

    我刚刚开始使用 Material UI 5 0 4 带有styled components 我想访问组件中的主题 我在网上查了一下 看到useTheme 所以我检查了文档并found it https mui com styles adva
  • 自动实例化会话bean?

    我有一个会话 bean
  • 是否可以通过电子邮件地址进行 XSS 攻击?

    我想知道电子 邮件地址是否可以用于XSS攻击 假设有一个网站 人们可以在其中注册并提供他的电子邮件地址 如果有人想要攻击给定的网站 他或她可能会创建一个电子邮件地址 例如 stmpname com 然后使用该电子邮件地址攻击该网站 电子邮件
  • 编写 lisp emacs 键绑定并且无法指定 字符

    由于某种原因 我将向后杀字的默认 M del 键绑定映射到匹配括号的扫描 并且重置不起作用 所以我尝试在 lisp 中设置全局键绑定 所以我在 emacs d init el 中编写了 lisp 命令 全局设置键 kbd M h 向后杀字
  • XSD 和 WSDL 位于不同的目录中

    在我的工作中使用 jaxws maven plugin 进行代码生成 我有两个项目分别是 common 和 client 结构大致如下 app common resource some xsd client resource some ws
  • 在 Blazor Web Assembly 应用中显示本地计算机摄像头源

    我已将问题简化为样板 Blazor Web Assembly 应用程序 该项目直接来自向导 添加了以下代码 我已将 Index razor 页面更改为 page inject IJSRuntime JSRuntime using Syste
  • 多设备混合应用程序中未指定 NodeJs 的路径

    当我尝试构建项目时 我收到一条错误消息 例如 NodeJs 的路径尚未指定 文件名为 Microsoft MDA target 如何在其中指定node js路径 错误消息是 尚未指定 NodeJs 的路径 请在构建之前检查 NodeJs 是
  • 错误:模板可能不是“虚拟”

    我希望能够向基类 MCFormater 提供适用于不同类型 uint32 uint8 的格式化方法 class MCFormater public MCFormater virtual MCFormater virtual mcc t Ge
  • 如何访问 Doctrine2 中 PrePersist LifecycleCallback 的旧值

    我在 Doctrine2 中有一个实体 并将 HasLivecycleCallbacks 与 PrePersist 一起使用 一般来说 这工作得很好 但我只想在实体中的某些字段发生变化时更改版本 我有机会获得旧的价值观吗 还是只是更改了键值
  • 我可以通过 ssh 转发环境变量吗?

    我使用多个不同的服务器 如果能够设置一些环境变量 以便当我通过 SSH 登录时它们在所有服务器上都处于活动状态 这将很有用 问题是 某些变量的内容包含敏感信息 散列密码 所以我不想把它留在 bashrc 文件中 我只想将它保留在内存中 我知
  • ThreeJS - 直线和球体的交点

    我的场景中有两个对象 一条红线和一个球体 当相机旋转 缩放 移动时 我需要检查以下内容 从相机当前位置看 该线是否与球体相交 请参见下图 请用这个 JS 小提琴 http jsfiddle net YxK63 7 在图像上创建场景 我知道如
  • Jekyll - 如何避免在 YAML frontmatter markdownify 项目上添加段落

    好的 我有一个项目 我正在使用 Jekyll 进行播客项目 我选择通过 YAML Front Matter 项目在 shownotes 中列出主机 hosts Name A Name B Name C 使用这段代码 li strong Ho
  • CSV 中数据提取末尾的尾随逗号

    我的问题的一些背景 我有一个由 MS Access 中的查询创建的 CSV 文件 CSV 文件的主体包含列 姓名 地址 邮政编码 日期等 文件的最后一行包含数据摘要 文件名 日期 时间戳和记录总数 由于所有字段都包含字符串 并且我们不希望系
  • Travis CI for Android - 构建错误:无法找到目标且无法找到依赖项

    我正在尝试为我的 Travis CI 设置现有的Android项目 https github com evercam evercam play android我添加了 travis yml language android android
  • 使用 Json.NET 对 DataContractJsonSerializer 使用的结构中的字典进行(反)序列化? [复制]

    这个问题在这里已经有答案了 有没有办法使用 Json NET 进行 反 序列化 但继续使用字典序列化约定DataContractJsonSerializer 换句话说 有没有办法以这种结构读写 JSON MyDict Key One Val
  • 当选项的值为“None”时动态确定选项的类型

    动态获取 Option 类型有一些困难 假设我有一个函数 let printType x if box x null then printfn the type is null else printfn the type is A x Ge