gpt4 book ai didi

visual-studio - F# 中具有不同返回类型的可区分联合类型检查

转载 作者:行者123 更新时间:2023-12-04 06:16:48 25 4
gpt4 key购买 nike

我正在尝试用 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

我想要确定表达式是字符串、整数还是 bool 值的方法。

但是,visual studio 在 checkType 方法的第 4 行给我以下错误:

 This expression was expected to have type string but here has type int

我错过了什么吗?

最佳答案

扩展 John Palmer 的评论:

F# 期望每个函数都有一个单一的返回类型。例如,您可以编写一个接受 int 并返回 int 的函数,这将是 int -> int 类型的函数。将字符串解析为整数的函数的类型为 string -> int。等等。

现在,您编写的 checkType 函数的返回类型是什么?由于您没有指定返回类型,编译器会查看您可以从函数返回的值的类型——每个可能的代码分支都必须返回一个值,并且它们必须都是相同的类型。所以它会查看您的 match 语句,看到它的第一个分支返回一个 string,然后说,“啊哈!我已经弄清楚了这个函数的返回类型;这是一个接受 Expr 并返回字符串的函数。该函数的类型是 Expr -> string。”

然后它查看您的match 语句的第二个分支,并说,“等一下。这是一个返回string 的函数,但是在这段代码中分支它返回一个 int。这是无效的:调用此函数的代码需要知道期望它返回什么类型。”所以你得到了错误。

现在,如果您要交换 match 语句案例的顺序,首先检查 Integer i,那么编译器会将您的函数评估为具有类型 Expr -> int(采用 Expr 输入并返回 int 输出),并在 | 上抛出错误字符串 s -> s 行。这一次,错误将是“等一下,这是一个返回 int 的函数,所以这里的表达式 s 应该是 int< 类型。但是,它是 string 类型。那是无效的。”

或者删除| String s -> s 行,你会看到一个错误“This expression was expected to have type int but here has type bool.”同样的事情:每个函数只能有一个返回类型。如果您想从一个函数返回多个不同的可能类型,这就是可辨别联合的用途。

有关 F# 类型的更多阅读,请参阅 http://fsharpforfunandprofit.com/series/understanding-fsharp-types.html .

关于visual-studio - F# 中具有不同返回类型的可区分联合类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36683644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com