6.4 处理选项类型
F# 中,最重要的可选值之一就是选项(option)类型。回顾一下我们的在前面的章节中看到,它给了我们一种安全的方法来表示值可能会缺失的事实。此安全性意味着,我们不能轻松地写代码,可能假定值是存在的,也可能当这个选项类型表示缺失值时,将失败。相反,我们必须使用模式匹配,为这两种情况而写代码。在这一节中,我们将学习两个有用的函数,处理选项类型。
注意
我们刚才看到的处理元组的函数不属于 F# 库,因为,它们非常简单,显式使用元组通常足够容易。然而,我们将在这一节中看到的,处理选项类型的函数,是标准的 F# 库的一部分。
首先,让我们快速看一个示例,说明了为什么我们需要高阶操作来处理选项类型。我们将使用来自前一章的 readInput 函数,从控制台读取用户输入,并返回一个 int option 类型的值。当用户输入有效的数字时,它将返回 Some(n) ;否则,它将返回 None。清单 6.10 显示了我们如何实现这个函数,读取两个数字。并返回它们的和,或者 None,当任一个输入的不是有效数字时。
Listing 6.10 Adding two options using pattern matching (F#)
let readAndAdd1() =
match (readInput()) with
| None –> None
| Some(n) –>
match (readInput()) with
| None –> None
| Some(m) –>
Some(n + m)
该函数调用 readInput,读取第一个输入,使用使用模式匹配提取值,并为第二个输入重复此过程。当两个输入都是正确的,相加并返回 Some ;在所有其他分支,都返回 None。不幸的是,显式使用模式匹配使代码更长。现在,让我们看两个操作,将帮助我们更加简洁地重写代码。