Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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
Visual studio 返回类型不同的F#中的判别并集类型检查_Visual Studio_F#_Functional Programming_Interpreter_Discriminated Union - Fatal编程技术网

Visual studio 返回类型不同的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

我正试着用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 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
,那么编译器会将您的函数评估为具有type
Expr->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

当前错误是由于函数只能返回一种类型的表达式