Visual studio 返回类型不同的F#中的判别并集类型检查
我正试着用F#写一个口译员。我想检查表达式的类型 这是我受歧视的表达联盟Visual studio 返回类型不同的F#中的判别并集类型检查,visual-studio,f#,functional-programming,interpreter,discriminated-union,Visual Studio,F#,Functional Programming,Interpreter,Discriminated Union,我正试着用F#写一个口译员。我想检查表达式的类型 这是我受歧视的表达联盟 type Expr = | Integer of int | String of string | Boolean of bool 这是我用来检查类型的方法 let checkType (e:Expr) = match e with | String s -> s | Integer i -> i | Boolean b -> b 我希望该方法确定表达式是字符串、整数还是布尔值 但是,visual
type Expr =
| Integer of int
| String of string
| Boolean of bool
这是我用来检查类型的方法
let checkType (e:Expr) =
match e with
| String s -> s
| Integer i -> i
| Boolean b -> b
我希望该方法确定表达式是字符串、整数还是布尔值
但是,visual studio在checkType方法的第4行中给出了以下错误:
This expression was expected to have type string but here has type int
我遗漏了什么吗?要详细介绍约翰·帕尔默的评论: F#希望每个函数都有一个返回类型。例如,您可以编写一个接受int并返回int的函数,该函数的类型为
int->int
。将字符串解析为int的函数的类型为string->int
。等等
现在,您编写的checkType
函数的返回类型是什么?由于您没有指定返回类型,编译器会查看您可以从函数返回的值的类型——每个可能的代码分支都必须返回一个值,并且它们都必须是相同的类型。因此,它查看您的match
语句,看到它的第一个分支返回一个string
,并说,“啊哈!我已经计算出了这个函数的返回类型;这是一个接受Expr
并返回字符串的函数。函数的类型是Expr->string
”
然后它查看match
语句的第二个分支,并说:“等一下,这是一个返回字符串的函数,但在这个代码分支中,它返回的是int
。这是无效的:调用此函数的代码需要知道它将返回什么类型。”因此,您得到了错误
现在,如果您要交换match
语句案例的顺序,首先检查整数i
,那么编译器会将您的函数评估为具有typeExpr->int
(获取Expr
输入并返回int
输出),并在| String s->s
行上抛出一个错误。这一次,错误是“稍等,这是一个返回int
的函数,因此这里的表达式s
应该是int
类型。但是,它是string
类型。这是无效的。”
或者删除| String s->s
行,您将看到一个错误“此表达式的类型应为int
,但此处的类型为bool
”。同样,每个函数只能有一个返回类型。如果您想从一个函数返回多个不同的可能类型,这就是区分联合的用途
有关F#类型的详细信息,请参阅。您可以将所有表达式包装成一个选项类型,如某些或字符串:
let checkType (e:Expr) =
match e with
| String e -> "we are string: " + string e
| Integer e-> "we are integer: " + string e
| Boolean e -> "we are boolean: " + string e
当前错误是由于函数只能返回一种类型的表达式