【发布时间】:2018-04-04 17:38:01
【问题描述】:
问题的根源在于这个external:
external make : string -> 'a -> unit = "debug"
我需要与任何类型一起使用:
let debug = make "name:space:a"
let _ = debug "log this thing"
let _ = debug 42
很遗憾,这会导致最后一行出现以下错误:
此表达式的类型为 int,但表达式应为字符串类型
所以我需要使类型参数显式地多态,但据我所知,由于某种原因,这只能在附加到 let 绑定的类型注释中完成。将其添加到外部会产生语法错误。所以我尝试:
let debug : 'a. 'a -> unit = make "name:space:a"
这当然会导致错误:
此定义的类型为 'a -> 单元,它不如 'a0 通用。 'a0 -> 单位
所以我尝试了另一种欺骗系统的方法,并在external之后添加了这个:
let make : 'a. string -> 'a -> unit = make
令我惊讶的是,这行并没有给我类似的类型错误,但似乎只是忽略了类型注释并继续在 let debug ... 上给我同样的错误。
这让我很困惑,并提出以下问题:
- 真的不能用多态类型定义外部吗?
- 不管 1 的答案如何,为什么不能对外部使用显式多态类型注释?
- 为什么
let make ...上的类型注释完全被忽略了?
注意:我使用的是 4.02.3 上的 BuckleScript。在线游乐场here.
【问题讨论】:
标签: types polymorphism ocaml external ffi