f# - 使用 TryParse 进行重载解析
问题描述
我们有一个函数将诸如Int32.TryParse
从使用 byref 转换为使用 Option 作为返回值之类的东西。
let inline ToOptionFunc refFunction x =
match refFunction x with
| true, value -> Some value
| false, _ -> None
像这样的东西停止在 .NET Core 中编译,并带有 TryParse 的新重载:
let Int32TryParse (x:string) =
ToOptionFunc Int32.TryParse x // A unique overload for method 'TryParse' could not be determined (...)
我尝试了很多东西,却意外地通过这样写来让它工作:
let Int32TryParse (x:string) =
x |> ToOptionFunc Int32.TryParse
我只是不明白为什么这个编译而前者没有。
解决方案
在 .NET Core 中,该Int32.TryParse
函数有一些额外的重载——它可以解析string
或解析ReadOnlySpan<char>
. 原始代码停止工作,因为编译器不知道您要使用哪个重载。
在没有管道的版本中,编译器需要进行类型检查
ToOptionFunc Int32.TryParse x
。它从左到右进行,当它到达时Int32.TryParse
,它还不知道x
(它有一个类型注释将它限制为string
),并且不知道x
,它不知道TryParse
你需要哪个。在带有管道的版本中,编译器需要进行类型检查
x |> ToOptionFunc Int32.TryParse
。它从左到右进行并知道x
是string
,因此它推断传递给的函数ToOptionFunc
也必须是string
- 当它检查时Int32.TryParse
,它已经可以唯一地确定重载。
总结是,管道具有非常好的指导类型检查的属性!
推荐阅读
- java - 在 tomcat 应用程序部署期间获取主机名
- r - R - 用于替换缺失值的用户定义函数
- .net-core - 由于 NU1100,无法发布自包含的 dotnet-core 应用程序
- python - 如何在 Python 中“捕获”程序的标准输入、标准输出、标准错误?
- node.js - 使用邮递员将dataSchema发送到mongodb
- javascript - 如何获取并显示所有恢复的数据?
- laravel - Laravel 唯一依赖于其他列
- kubernetes - 为 ValidatingWebhookConfiguration 使用密码
- c++ - WIN API - 选择按钮时程序卡住
- python - 如何安装 spcopula 包