对未来读者的澄清:在更新之前,此答案是为原始问题编写的。原来的问题是:
与 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)
除了这项技术要求之外,类型注释当然作为文档(保证不会不同步)以及失控类型推断的障碍非常有价值。
| 归档时间: |
|
| 查看次数: |
239 次 |
| 最近记录: |