F# 模块签名文件有哪些用例?

What are use cases for F# module signature files?

与 OCaml 不同,F# 模块签名文件是否大多无用,因为 F# 没有函子?

F# 模块签名文件有哪些用例?

为未来的读者澄清:此答案是在更新之前针对原始问题编写的。原问题是:

Are F# signatures mostly useless, unlike OCaml, because F# doesn't have functors?

What are use cases for F# signatures?


虽然 F# 没有 OCaml 模块和仿函数,但它确实有接口和对象,它们提供类似的功能,但功能更有限。这些确实需要类型签名,因为类型推断对它们不起作用。例如:

type MyIntf =
    abstract member m : sting -> int

let f i = i.m "hello"  
// ^ error: cannot lookup member "m" on object "i" of indeterminate type

请注意,我已经需要一个类型注释来 定义 接口,因为在没有成员实现的情况下没有其他类型信息来源 m。但除此之外,如果没有显式类型,我的接口的 usage 也无法工作。

虽然不清楚推断对象和接口的类型实际上是不可能的,但 F# 只是不会尝试这样做。 F# 的官方政策是,只要你是纯函数式的,你就会受到 HM 类型的干扰,但是一旦你进入对象和成员,你就只能靠自己了,编译器不会帮助你。

为了让上面的函数f工作,我必须注释i参数的类型:

let f (i : MyIntf) = i.m "hello"   // works now

除此技术要求外,类型注释作为文档(保证不会不同步)以及防止类型推断失控的障碍当然非常有价值。