F#帮助类型推断的方法?

F#帮助类型推断的方法?,f#,type-inference,F#,Type Inference,由唐·赛姆、亚当·格拉尼茨和安东尼奥·西斯特尼诺合著,第44页 类型推断:使用|>运算符可以让类型信息从 将对象输入到操作这些对象的函数。F#使用 从类型推断中收集的用于解析某些语言的信息 构造,例如属性访问和方法重载。这 依赖于信息在文本中从左到右传播 一个程序的名称。特别是,在位置右侧键入信息 在解决属性访问和重载时不考虑 显然,使用|>可以帮助进行类型推断 与往常一样,声明类型也很有帮助 有没有其他方法/策略可以用来帮助F型推理 编辑 正如RamonSnir正确指出的那样,我们应该让类型推

由唐·赛姆、亚当·格拉尼茨和安东尼奥·西斯特尼诺合著,第44页

类型推断:使用|>运算符可以让类型信息从 将对象输入到操作这些对象的函数。F#使用 从类型推断中收集的用于解析某些语言的信息 构造,例如属性访问和方法重载。这 依赖于信息在文本中从左到右传播 一个程序的名称。特别是,在位置右侧键入信息 在解决属性访问和重载时不考虑

显然,使用|>可以帮助进行类型推断

与往常一样,声明类型也很有帮助

有没有其他方法/策略可以用来帮助F型推理

编辑

正如RamonSnir正确指出的那样,我们应该让类型推断尽可能多地完成工作。因此,仅仅因为可以添加类型声明,而不应该这样做。不要把这个问题或答案当作应该做的事情。我问这个问题是为了更好地理解类型推理的细微差别,以及在类型推理需要帮助的情况下,什么可能会有所帮助。因此,如果类型推断可以在没有帮助的情况下解析所有类型,那么不要给它任何帮助,但当它这样做时,最好知道一些帮助它的方法。

几点:

1) 与属性和方法相比,更喜欢模块函数

List.map (fun x -> x.Length) ["hello"; "world"] // fails
List.map String.length ["hello"; "world"] // works

let mapFirst xss = Array.map (fun xs -> xs.[0]) xss // fails
let mapFirst xss = Array.map (fun xs -> Array.get xs 0) xss // works
2) 更喜欢没有重载的方法。例如,定义非重载成员以避免LINQ扩展方法中出现大量类型注释

3) 利用任何可用信息向类型检查器提供一些提示

let makeStreamReader x = new System.IO.StreamReader(x) // fails
let makeStreamReader x = new System.IO.StreamReader(path=x) // works
最后一个例子摘自一篇优秀的文章

总之,您通常不需要帮助F#type checker。如果存在类型错误,则上面链接中的摘要提供了一个良好的修复指南:

总之,如果编译器是 抱怨缺少类型或信息不足的有:

  • 在使用前定义内容(包括确保文件按正确顺序编译)
  • 将具有“已知类型”的事物放在具有“未知类型”的事物之前。特别是,您可以对管道重新排序 和类似的链式函数,使类型化对象排在第一位
  • 根据需要进行注释。一个常见的技巧是添加注释,直到一切正常,然后逐个删除注释,直到完成 所需的最低限度。尽可能避免注释。不仅 它在美学上不美观,但它使代码更加脆弱。 如果没有显式的 对它们的依赖