【发布时间】:2022-01-20 12:08:29
【问题描述】:
我定义了一个有缺陷的函数:
let first : 'a -> 'b -> 'a = fun x y -> y ;;
(* Result: val first : 'a -> 'a -> 'a = <fun> *)
编译器接受它并将类型从'a->'b->'a 更改为'a->'a->'a。
它不应该工作,因为返回类型应该是'a,而不是'b。
正确实现:
let first : 'a -> 'b -> 'a = fun x y -> x ;;
(* Result: val first : 'a -> 'b -> 'a = <fun> *)
为什么它会起作用以及如何防止编译器像这样改变类型?更复杂的表达式会成为问题。
【问题讨论】:
-
OCaml 没有能力表达类型约束“任何不是
'b的'a”。我知道的任何其他语言也没有。如果这不仅仅是一个理论上的问题,绝对没有问题,也许您可以尝试在更高的层次上解释您要解决的问题? -
我想在写的时候得到异常:
let ex56: 'a->'b->'a = fun x y -> x。但不会重写我的代码。 -
这是不可能的。恐怕在这个抽象级别上没有更多的东西可以提供。
-
我在想这种类型的函数会限制实现。
-
可以,但
'a -> 'b -> 'a中表达的唯一约束是第一个参数和返回值必须具有相同的类型。'a和'b都可以替换为 any 类型,它们没有理由不能是 same 类型。
标签: types ocaml type-inference parametric-polymorphism