【发布时间】:2018-01-13 22:39:06
【问题描述】:
1) 假设有一个模块
module Int_Sig_1 =
struct
let x = 1
end
;;
2) 以及该模块的显式签名
module type INT_SIG =
sig
val x:int
end
;;
3) 我根据上面的模块和模块类型创建了一个一流的模块
let int_sig_1 = (module Int_Sig_1:INT_SIG)
4) 现在我创建另一个没有显式签名但推断签名与上面相同的模块
module Int_Sig_2 =
struct
let x =2
end
;;
5) 正如 Real World OCAML 一书的第 10 章所写的“如果可以推断,模块类型不需要成为第一类模块构造的一部分”,我尝试先创建第二个使用上述模块但没有显式模块类型的类模块
let a2 = (module Int_Sig_2);;
我收到以下错误
错误:无法推断此打包模块的签名。
6) 然后我尝试在 5 中执行与上面相同的操作,但这次我将创建的 没有模块类型的第一类模块作为列表的元素,其中的头该列表是由上面 3 中的显式签名创建的第一类模块。
let int_sig= [int_sig_1;(module Int_Sig_2)];;
val int_sig : (module INT_SIG) list = [<module>; <module>] ;;
我的问题是为什么上面的 5 给了我一个错误,而 6 没有失败?
【问题讨论】:
标签: module ocaml type-inference signature first-class