我只是在学习 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'的返回表达式中的错误。第一个,第二个和最后一个“let”的可能正确缩进”。
“可能不正确的缩进:此标记超出了从位置 (39:10) 开始的上下文。尝试进一步缩进此标记或使用标准格式约定”作为“如果”
最后一行(结果)的“表达式中此点处或之前的不完整结构化构造”。
我要补充一点,我不得不花点时间来注释类型,因为由于某种我不知道的原因,编译器能够正确推断第一个列表,但对于第二个列表,类型总是被推断为单元另外,我的原始版本没有绑定名称结果,而只是“返回表达式”,如
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”可能缩进不正确。
我想当我看到这个问题的解决方案时,我会觉得很傻,但是我已经被这样一个简单的问题困住了一个多小时,所以我请求你的帮助。
提前致谢!
ps:我已经检查了选项卡在工具->选项->....-> F#->选项卡菜单中被正确解释为空格
pps:这是我关于 SO 的第一个问题 :-)