ocaml - 此 OCaml 表达式在未定义为 AFAIK 时具有其参数的类型,为什么此其他表达式具有 '_a 而不是 'a?
问题描述
我明白了
let apply f x = f x
有类型
('a -> 'b) -> 'a -> 'b
apply
是一个函数,它接受一个函数f
和一个参数x
并返回f
应用于x
. 因此,如果f x
has type'b
和x
has type 'a
,则f
必须有 type 'a -> 'b
,因此您将它们组合起来得到('a -> 'b) -> 'a -> 'b
。我明白了。通过扩展,let identity f = f
具有类型'a -> 'a
,因为它接受一个类型的项目'a'
并返回相同的类型项目'a
,所以它是类型'a -> 'a
。我明白了。
let bf b f = if (f b) then f else (fun x -> b)
是类型
bool -> (bool -> bool) -> bool -> bool
f b
必须是 type bool
,因此f
is'a -> bool
并且b
has type 'a
。f
, of type与which is'a -> bool
具有相同的类型。所以, , so取, 那么 的类型是, 并返回, 最终的类型是fun x -> b
'c -> 'a
'c = 'a = bool
bf
bool
f
bool -> bool
bool -> bool
bool -> (bool -> bool) -> bool -> bool
我必须找到类型
let t1 = apply bf
与 相同的类型apply bf
。
所以,apply f
是'a -> 'a
if f
has type 'a
,所以我希望apply bf
有type(bf) -> type(bf)
bool -> (bool -> bool) -> bool -> bool -> bool -> (bool -> bool) -> bool -> bool
显然apply bf
是类型bool -> (bool -> bool) -> bool -> bool
,我不明白为什么会这样。
我也不明白'a
类型和'_a
类型之间的区别。
如果let apply f x = f x
, 那么apply
有 类型('a -> 'b) -> 'a -> 'b
, 并且let app2 = apply apply
有 类型
('_a -> '_b) -> '_a -> '_b
如果有人可以帮助我理解为什么会这样,这样我就不会在不理解的情况下简单地提交答案而感到迷失,那将不胜感激。
解决方案
我希望 apply bf 有 type(bf) -> type(bf)
这是错误的。首先请注意,应用程序的打字规则是,
f : A -> B
x : A
-------------
f x : B
在您的情况下,存在多态性,但想法是相同的,
apply : ('a -> 'b) -> ('a -> 'b)
bf : A -> B
------------------------------------
apply : (A -> B) -> (A -> B)
bf : A -> B
------------------------------------
apply bf : A -> B
我也不明白 'a 类型和 '_a 类型之间的区别。
该符号'_a
表示一个虚拟类型,并且是“值限制”的结果,它指出只有值表达式可以是多态的。见http://mlton.org/ValueRestriction
推荐阅读
- javascript - ReactJs 错误:渲染后需要分号
- javascript - 该脚本如何在“对象”上使用“推送”?
- c# - 当我调用 SendKeys 方法时,我的驱动程序不会更新 URL。SeleniumWebDriver,C#
- api - REST API:如何根据运行时应用程序状态管理同一资源的不同表示?
- python - 使用 pybnb 包进行分支和绑定
- flutter - Flutter appbar 动作调用底部导航栏子方法
- java - Stringbuilder 到 Array 到 2D Array 导致 NullPointerException JAVA
- flutter - 如何使 FlutterFire 查询约束匹配安全规则约束?
- bubble.io - Bubble.io - 如何显示当前目录?
- excel - 是否可以从列中过滤唯一值并将具有适当值的唯一值从不相邻的列复制到新工作表?