Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types f#先前模式匹配保护中的狭义判别并集(基于控制流的类型分析)_Types_F# - Fatal编程技术网

Types f#先前模式匹配保护中的狭义判别并集(基于控制流的类型分析)

Types f#先前模式匹配保护中的狭义判别并集(基于控制流的类型分析),types,f#,Types,F#,如果F#类型在以前的守卫中被缩小,它会缩小类型吗 type FirstOption=bool选项 键入SecondOption=bool选项 让福先来= 首当其冲 |无->错误 |second.IsSome时的某些值-> //第二个仍然是选择 sencond//x这不会飞。 |某些值->错误 在这些情况下,我一直在使用Optopn.map/map2/map3,但我想知道我是否做错了什么 对于TypeScript,它们具有基于控制流的分析:我认为F#没有基于控制流的分析作为TypeScript,

如果F#类型在以前的守卫中被缩小,它会缩小类型吗

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类型和可变状态,加上
不限于输入本身时的
,可能无法对所有场景进行确定性分析。(你的例子可以很容易地以不同的方式编写,如答案中所示)。什么值(第一个布尔值)重要吗?下面的几个答案似乎都认为这是真的