Types f#先前模式匹配保护中的狭义判别并集(基于控制流的类型分析)
如果F#类型在以前的守卫中被缩小,它会缩小类型吗Types f#先前模式匹配保护中的狭义判别并集(基于控制流的类型分析),types,f#,Types,F#,如果F#类型在以前的守卫中被缩小,它会缩小类型吗 type FirstOption=bool选项 键入SecondOption=bool选项 让福先来= 首当其冲 |无->错误 |second.IsSome时的某些值-> //第二个仍然是选择 sencond//x这不会飞。 |某些值->错误 在这些情况下,我一直在使用Optopn.map/map2/map3,但我想知道我是否做错了什么 对于TypeScript,它们具有基于控制流的分析:我认为F#没有基于控制流的分析作为TypeScript,
type FirstOption=bool选项
键入SecondOption=bool选项
让福先来=
首当其冲
|无->错误
|second.IsSome时的某些值->
//第二个仍然是选择
sencond//x这不会飞。
|某些值->错误
在这些情况下,我一直在使用Optopn.map/map2/map3,但我想知道我是否做错了什么
对于TypeScript,它们具有基于控制流的分析:我认为F#没有基于控制流的分析作为TypeScript,但在这种情况下,您可以执行以下操作:
type FirstOption=bool选项
键入SecondOption=bool选项
let foo(第一个:bool选项)(第二个:bool选项)=
先配,后配
|先有人,后有人->
//现在有了第一个和第二个布尔值
第一个和第二个//它像风一样飞:D
|_u->false
您可以在两个选项上进行模式匹配(很好地匹配两个选项的元组)
要转换示例,请执行以下操作:
let foo first second =
match (first, second) with
| (None, _) -> false
| (Some _, Some s) -> s
| (Some x, None) -> false
可简化为:
let foo first second =
match (first, second) with
| (Some _, Some s) -> s
| _ -> false
据我所知,F#不提供基于控制流的类型分析。我认为这与F#作为一种以表达为导向的语言的设计背道而驰
然而,F#提供了一些机制来处理这个问题
第一个是使用模式匹配的嵌套match
语句:
让foo先来=
首当其冲
|有些是真的->
次于
|有些是真的->真的
|_u->false
|_u->false
第二种方法,正如其他人所指出的,是在元组上使用单个匹配。请注意,元组中的元素不需要具有相同的类型
让foo先来=
先配,后配
|有些是真的,有些是真的->真的
|_u->false
请注意,在您的特定示例中,使用选项可能最简单。defaultValue
:
让foo第一秒=
(Option.defaultValue首先为false)
&&(Option.defaultValue假秒)
您对该设计决策有参考意见吗?这是有意义的,匹配元组是一个更好的解决方案。@CodingEdgar我恐怕不知道,鉴于我(业余)对编程语言设计的理解,这对我来说是有意义的。这里可以找到一个很好的讨论:。请注意,流分析非常困难,并且使用ref类型和可变状态,加上不限于输入本身时的,可能无法对所有场景进行确定性分析。(你的例子可以很容易地以不同的方式编写,如答案中所示)。什么值(第一个布尔值)重要吗?下面的几个答案似乎都认为这是真的