Ocaml 的类型推断
Type Inference of Ocaml
我是 Ocaml 的新手。这是我 class 中的一个问题:
让 f a b c d e = e.( if e.(1) then a b else b d )
我们被要求推断“a”的类型。我认为它是一个 int,因为这个 if 操作应该 return 一个 int 来作为 e 数组的索引。但我的回答是错误的。谁能帮我分析一下?非常感谢!
if
的值为 a b
或 b d
。由于表达式 a b
必须 return 一个 int(如你所说),a
必须是一个接受一个参数的 函数 并且 return 是一个整数。所以 a
不是一个整数而是一个函数。
a
的参数类型也是a
类型的一部分。要确定此类型,请注意 b
也是一个 return 是 int 的函数(正如您可以从子表达式 b d
中看出的那样)。所以 a
是一个函数,它接受一个函数参数和 returns int。由于代码中没有任何内容来限制 d
的类型,b
可以是接受一个参数且 return 是一个 int 的任何函数。我们称 b 的参数类型为 't
。请注意,对于 f
的不同调用,此类型可能不同。那么a
的类型是('t -> int) -> int
,其中b
对应的类型是't -> int
,d
的类型是't
。
这一切都非常复杂。可能你的转录有错别字。或者,也许最好找出一个复杂的例子:-)
以上语句等价于:
fun f(a,b,c,d) = e[如果 e[1] 那么 a(b) 否则 b(d) ]
__
注:
"if e[1] then a(b) else b(d)" :这应该是一个整数,因为它充当 e 数组的索引。函数将 return 相同的类型,因此 a(b) 和 b(d) 的类型相等并且应该 return 整数。
e[1] = 这应该是布尔值,这意味着 e 是一个布尔数组。
因此我们得出结论
e : 布尔数组
a : 函数 returns 一个整数
b : 函数 returns 一个整数。
我们无法进一步对 c 和 d 进行类型推断。
我是 Ocaml 的新手。这是我 class 中的一个问题:
让 f a b c d e = e.( if e.(1) then a b else b d )
我们被要求推断“a”的类型。我认为它是一个 int,因为这个 if 操作应该 return 一个 int 来作为 e 数组的索引。但我的回答是错误的。谁能帮我分析一下?非常感谢!
if
的值为 a b
或 b d
。由于表达式 a b
必须 return 一个 int(如你所说),a
必须是一个接受一个参数的 函数 并且 return 是一个整数。所以 a
不是一个整数而是一个函数。
a
的参数类型也是a
类型的一部分。要确定此类型,请注意 b
也是一个 return 是 int 的函数(正如您可以从子表达式 b d
中看出的那样)。所以 a
是一个函数,它接受一个函数参数和 returns int。由于代码中没有任何内容来限制 d
的类型,b
可以是接受一个参数且 return 是一个 int 的任何函数。我们称 b 的参数类型为 't
。请注意,对于 f
的不同调用,此类型可能不同。那么a
的类型是('t -> int) -> int
,其中b
对应的类型是't -> int
,d
的类型是't
。
这一切都非常复杂。可能你的转录有错别字。或者,也许最好找出一个复杂的例子:-)
以上语句等价于:
fun f(a,b,c,d) = e[如果 e[1] 那么 a(b) 否则 b(d) ]
__
注:
"if e[1] then a(b) else b(d)" :这应该是一个整数,因为它充当 e 数组的索引。函数将 return 相同的类型,因此 a(b) 和 b(d) 的类型相等并且应该 return 整数。
e[1] = 这应该是布尔值,这意味着 e 是一个布尔数组。
因此我们得出结论
e : 布尔数组
a : 函数 returns 一个整数
b : 函数 returns 一个整数。
我们无法进一步对 c 和 d 进行类型推断。