f# - 与类型注释匹配的模式
问题描述
在https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/pattern-matching#tuple-pattern,有一个带有类型注释的模式示例:
模式可以有类型注释。它们的行为类似于其他类型注释,并像其他类型注释一样指导推理。模式中的类型注释周围需要括号。以下代码显示了具有类型注释的模式。
let detect1 x = match x with | 1 -> printfn "Found a 1!" | (var1 : int) -> printfn "%d" var1 detect1 0 detect1 1
类型注释是多余的,因为前面模式中(var1 : int)
的文字明确地建立了类型。1
在任何情况下,诸如此类的类型注释会有用吗?
解决方案
实际上,即使您在函数参数中使用类型注释,您也在模式中使用类型注释。F# 模式匹配甚至适用于函数参数(let
通常是绑定)。
因此,像往常一样,当我们想要立即强制执行类型而不是依赖类型推断时,类型注释很有用。我们可以有很多地方放置类型注释来达到相同的结果。只需选择最适合情况的地方即可。考虑下面的例子:
let detect2 (x : int option) =
match x with
| Some y -> ...
| None -> ...
我们可以写得更短:
let detect2 x =
match x with
| Some (y : int)
| None -> ...
在这种情况下,我们应该选择后一种。
推荐阅读
- angular - 依赖于其他表单控件的 Angular formControl 验证器
- python - Django extra + where:如何转义标识符
- javascript - 凹形和封闭形状填充的 RoughJS 问题
- javascript - 如何在 javascript 类中模拟受保护的变量?
- python - 如何根据 Jupyter 笔记本中的单选按钮更改输入值?
- windows - Crypto API 中的 CryptGenKey 与 Crypto Next Gen
- nuget - 使用 serilog 2.10 创建的 nuget 包引发找不到文件 serilog 版本 2.0.0 错误
- ffmpeg - 主 m3u8 文件未列出流
- flutter-layout - circleavatar networkImage的颤振问题没有改变
- asp.net-core - 为什么在我的 ASP.NET Core 5 应用程序中从我的 KendoUI Grid 发布更新时我的模型总是为空?