【发布时间】:2010-11-06 00:58:33
【问题描述】:
什么时候让编译器做它的事情是可取的,什么时候我应该在声明变量类型时显式?
【问题讨论】:
标签: f# type-inference
什么时候让编译器做它的事情是可取的,什么时候我应该在声明变量类型时显式?
【问题讨论】:
标签: f# type-inference
简单,在 F# 中,总是更喜欢让编译器“做它的事”。否则,编写其强大类型推理系统的人会很难过。
说真的,我知道在 C# 中存在(或曾经?)关于何时或何时不使用 var 推断变量类型的争论。但我相信那里对缺乏清晰度的担忧源于一个不熟悉简洁、强类型语言的社区,并担心var 是某种不可信的动态巫术。但是我们现在在 C# 中以及在 F# 中多次使用的东西是世界上最好的。强大的自动打字。而“变量”只是冰堡的一角。真正令人惊奇的是 F# 对函数类型签名的推断。有一段时间我认为这太过分了,写出完整的签名会更清楚。伙计,你克服得那么快。
【讨论】:
我同意@Stephen,让编译器“做它的事”。
当您第一次开始使用类型推断语言时,这会感觉不自然,并且您会编写额外的类型注释,也许认为您需要它们以提高可读性。你很快就会克服的;具有良好变量名称的代码几乎不需要在任何地方拼出类型,类型注释通常只是过多地杂乱了您的算法。
我只能想到不拼写类型的几个一般性不利因素。首先,如果您只是将源代码视为一个文本文件,那么读者可能并不明白这些类型是什么。然而,这在很大程度上被诸如 Visual Studio 之类的工具提供了显示类型的悬停工具提示(例如,将鼠标悬停在foo 上,然后弹出一个工具提示显示foo 的类型)这一事实大大缓解。执行此推理的逻辑由编译器源代码公开,并且已轻松集成到其他工具中,例如F# web snippets、MonoDevelop 等。(请利用新的 Apache 许可证并为 github、emacs、和 gvim :),谢谢!)因此,大部分时间您都在查看代码,您将在一个可以按需显示类型的环境/工具中进行操作。
其次,当缺少类型注释时,有时很难调试类型错误。当您遇到无法弄清楚的奇怪类型推断错误时,添加一些显式注释以本地化类型错误会很有用。通常你会在你的代码中看到一些愚蠢的错误,修复它,然后你可以删除不必要的注释。
当然,有很多地方需要类型注解,因为类型推断不能解决所有问题。有关详细信息,请参阅下面的链接。一段时间后你会习惯这些,并且擅长预测何时需要或不需要注释。
http://lorgonblog.wordpress.com/2009/10/25/overview-of-type-inference-in-f/
【讨论】: