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

时间:2018-03-04 13:54:42

标签: f# signature

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

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

1 个答案:

答案 0 :(得分:4)

为未来的读者澄清:这个答案是在原始问题更新之前编写的。最初的问题是:

  

与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

请注意,我已经只需要定义接口的类型注释,因为在没有成员m的实现的情况下没有其他类型信息来源。但除此之外,我的界面的用法在没有明确类型的情况下也无法正常工作。

虽然不清楚对象和接口的推断类型实际上是不可能的,但F#并没有尝试这样做。官方F#政策是,只要您具有纯粹的功能,就会受到HM类型的干扰,但是只要您进入对象和成员,您就会自己动手,编译器就会赢得帮助你。

要使上述函数f有效,我必须注释i参数的类型:

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

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