F# 奇怪的类型错误信息
F# strange type error message
谁能告诉我以下错误消息在 F# 中的含义:
Program.fs(1021,16): error FS0001: This expression was expected to have type
FSI_0051.ExprTree
but here has type
FSI_0061.ExprTree
这是执行以下函数的结果:
let evaluate_tree tree =
let rec helper tree =
match tree with
| Value(x) -> Value(x)
| Node(l, op, r) -> evaluate (helper l) op (helper r)
get_float (helper tree)
第1021行是上述函数的最后一行。此外,我在evaluate_tree
之前声明了以下函数和类型:
type Operator =
| Plus
| Minus
| Mult
| Divide
type ExprTree =
| Value of float
| Node of ExprTree * Operator * ExprTree
static member (-) (a, b) =
match (a, b) with
| (Value(x), Value(y)) -> Value(x - y)
static member (+) (a, b) =
match (a, b) with
| (Value(x), Value(y)) -> Value(x + y)
static member (/) (a, b) =
match (a, b) with
| (Value(x), Value(y)) -> Value(x/y)
static member (*) (a, b) =
match (a, b) with
| (Value(x), Value(y)) -> Value(x*y)
请注意,在下面的函数中,当我没有添加说 Node(_,_,_) -> 0.0
(已注释)的行时,它给出了上述错误消息。但是,当我添加该行时,错误消息消失了(我仍然想知道错误消息的含义):
let get_float value =
match value with
| Value(x) -> x
//| Node(_, _, _) -> 0.0
let evaluate (value1 : ExprTree) operator (value2 : ExprTree) =
match operator with
| Plus -> value1 + value2
| Minus -> value1 - value2
| Mult -> value1*value2
| Divide -> value1/value2
let evaluate_tree tree =
let rec helper tree =
match tree with
| Value(x) -> Value(x)
| Node(l, op, r) -> evaluate (helper l) op (helper r)
get_float (helper tree)
进一步说明:evaluate_tree
计算表达式树。表达式树包含 ExprTree: Value and Node
中定义的类型。我认为这可能与我没有在 get_float
中提供案例有关,因为它是 Node
(我最终解释了)。然而,get_float
永远不会评估 Node
,而不是我使用它的方式,除非树是错误的(即它将有一个运算符作为叶节点)。
提前致谢!
您的错误是由于 FSI 中执行的每个计算实际上创建了一个动态程序集 FSI_XXXX。所以实际上,您使用 ExprTree
定义的函数可能指的是 FSI_0051.ExprTree
而您稍后定义并使用 ExprTree
的函数现在指的是 FSI_0061.ExprTree
.
我通常做的修复错误的方法是再次使用 ExprTree
执行我所有函数的定义,现在有更新的 FSI_0061.ExprTree
并且所有函数都应该工作。
您只需要注意,每个具有相同名称的新评估都会 遮蔽 先前存在的符号。另一方面,它们仍然是不同的符号,因此有两个名称 FSI_0051.ExprTree
和 FSI_0061.ExprTree
.
谁能告诉我以下错误消息在 F# 中的含义:
Program.fs(1021,16): error FS0001: This expression was expected to have type
FSI_0051.ExprTree
but here has type
FSI_0061.ExprTree
这是执行以下函数的结果:
let evaluate_tree tree =
let rec helper tree =
match tree with
| Value(x) -> Value(x)
| Node(l, op, r) -> evaluate (helper l) op (helper r)
get_float (helper tree)
第1021行是上述函数的最后一行。此外,我在evaluate_tree
之前声明了以下函数和类型:
type Operator =
| Plus
| Minus
| Mult
| Divide
type ExprTree =
| Value of float
| Node of ExprTree * Operator * ExprTree
static member (-) (a, b) =
match (a, b) with
| (Value(x), Value(y)) -> Value(x - y)
static member (+) (a, b) =
match (a, b) with
| (Value(x), Value(y)) -> Value(x + y)
static member (/) (a, b) =
match (a, b) with
| (Value(x), Value(y)) -> Value(x/y)
static member (*) (a, b) =
match (a, b) with
| (Value(x), Value(y)) -> Value(x*y)
请注意,在下面的函数中,当我没有添加说 Node(_,_,_) -> 0.0
(已注释)的行时,它给出了上述错误消息。但是,当我添加该行时,错误消息消失了(我仍然想知道错误消息的含义):
let get_float value =
match value with
| Value(x) -> x
//| Node(_, _, _) -> 0.0
let evaluate (value1 : ExprTree) operator (value2 : ExprTree) =
match operator with
| Plus -> value1 + value2
| Minus -> value1 - value2
| Mult -> value1*value2
| Divide -> value1/value2
let evaluate_tree tree =
let rec helper tree =
match tree with
| Value(x) -> Value(x)
| Node(l, op, r) -> evaluate (helper l) op (helper r)
get_float (helper tree)
进一步说明:evaluate_tree
计算表达式树。表达式树包含 ExprTree: Value and Node
中定义的类型。我认为这可能与我没有在 get_float
中提供案例有关,因为它是 Node
(我最终解释了)。然而,get_float
永远不会评估 Node
,而不是我使用它的方式,除非树是错误的(即它将有一个运算符作为叶节点)。
提前致谢!
您的错误是由于 FSI 中执行的每个计算实际上创建了一个动态程序集 FSI_XXXX。所以实际上,您使用 ExprTree
定义的函数可能指的是 FSI_0051.ExprTree
而您稍后定义并使用 ExprTree
的函数现在指的是 FSI_0061.ExprTree
.
我通常做的修复错误的方法是再次使用 ExprTree
执行我所有函数的定义,现在有更新的 FSI_0061.ExprTree
并且所有函数都应该工作。
您只需要注意,每个具有相同名称的新评估都会 遮蔽 先前存在的符号。另一方面,它们仍然是不同的符号,因此有两个名称 FSI_0051.ExprTree
和 FSI_0061.ExprTree
.