F#模块签名文件的用例是什么?

nau*_*nau 6 f# signature

与OCaml不同,F#模块签名文件大多没用,因为F#没有仿函数吗?

F#模块签名文件的用例是什么?

Fyo*_*kin 5

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

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

F# 签名的用例是什么?


尽管 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

let f (i : MyIntf) = i.m "hello"   // works now
Run Code Online (Sandbox Code Playgroud)

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