【发布时间】:2011-03-10 21:29:42
【问题描述】:
F# 编译器似乎以(相当)严格的从上到下、从左到右的方式执行类型推断。这意味着您必须做一些事情,例如在使用之前放置所有定义,文件编译的顺序很重要,并且您往往需要重新排列东西(通过|> 或您有什么)以避免显式类型注释。
要使其更灵活有多难,是否计划在 F# 的未来版本中实现这一点?显然这是可以做到的,因为 Haskell(例如)在同样强大的推理上没有这样的限制。导致这种情况的 F# 的设计或意识形态有什么本质上的不同吗?
【问题讨论】:
-
我实际上不喜欢这个问题,但它已经得到了一些精彩而富有启发性的回答,所以我也很不情愿地投了赞成票:)
-
@J Cooper:“Haskell(例如)在同样强大的推理中没有这样的限制”。当您考虑杂质或性能时,Haskell 远没有同样强大的类型推断。例如,Haskell 的
floor函数的运行速度通常比任何其他编译语言都慢几个数量级,这正是因为它无法推断出正确的静态类型,因此不得不求助于运行时调度。另外,如果我停止从randIntList函数中删除顶级类型注释,那么它就会停止编译并出现臭名昭著的ambiguous type variable错误。 -
我喜欢这个问题,因为我想几乎每个刚开始学习 F# 的人都有两个想法:“哇,F# 太强大了!”和“WTF,为什么 F# 不能做这种愚蠢的推理?!” :)
-
我是 F# 新手。现在,我正在尝试找出 FS0030:使用泛型函数时偶尔会遇到的值限制错误。
标签: f# language-design type-inference