我只是在学习f#,所以可能我做了一些很愚蠢的事情。如果有相关文档,请随时指出给我,我已经搜索过了但没有找到。我正在使用Windows 7 (.Net 4.0)上的Visual Studio 2010 beta。
我的第一个f#项目进展顺利。嗯...几乎所有的东西都很好。特别是我正在编写一个非常简单的线性插值函数,代码如下:
let linterp (x:double) (xvalues:double list) (yvalues:double list) =
let num_els = xvalues.Length
if x <= xvalues.Head then
let result = yvalues.Head
elif x >= (List.rev xvalues).Head then
let result = (List.rev yvalues).Head
else for idx in [0 .. num_els] do
if List.nth xvalues idx >= x then
let x0 = xvalues.Item idx
let y0 = yvalues.Item idx
let x1 = xvalues.Item (idx+1)
let y1 = yvalues.Item (idx+1)
let result = y0 + (y1-y0)/(x1-x0)*(x - x0)
result
我正在收到一系列错误,这些错误完全超出了我的理解能力。
以下是错误和警告列表:
对于第一个、第二个和最后一个“let”,出现“返回表达式中的错误。可能的正确缩进”。
对于“if”,出现“可能的缩进不正确:此令牌偏离了从位置(39:10)开始的上下文。尝试进一步缩进此令牌或使用标准格式约定。”
对于最后一行(结果),出现“在此点之前或之前存在不完整的结构化结构”。
我想补充说明的是,我必须费点心思来注释类型,因为由于某种我不知道的原因,编译器能够正确地推断出第一列表中的类型,但对于第二列表,类型总是被推断为unit。此外,我的原始版本没有绑定名称result,而只是“返回表达式”,例如:
if x <= xvalues.Head then
yvalues.Head
或者在
else for idx in [0 .. num_els] do
if List.nth xvalues idx >= x then
let x0 = xvalues.Item idx
let y0 = yvalues.Item idx
let x1 = xvalues.Item (idx+1)
let y1 = yvalues.Item (idx+1)
y0 + (y1-y0)/(x1-x0)*(x - x0)
这会导致“for”下出现一个错误,指出“该表达式类型为unit,但在此处与double类型一起使用”,并且“if”可能缩进不正确。
我认为当我看到这个问题的解决方案时,会觉得很傻,但我已经被这个简单的问题困扰了一个多小时,所以我请求您的帮助。
提前感谢!
附言:我已经检查过选项卡是否在Tools->options->...->F#->Tabs菜单中正确地解释为空格。
附言2:这是我在SO上的第一个问题 :-)
let x0 = xvalues.Item (idx - 1)
和let x1 = xvalues.Item idx
,因为 idx 表示大于或等于 x 的第一项。 - Francesco