Я только учусь f #, поэтому возможно я делаю что-то очень глупое. Не стесняйтесь указывать мне на соответствующую документацию, я искал, но не смог найти. Я использую бета-версию Visual Studio 2010 на Windows 7 (.Net 4.0).
Все идет хорошо с моим первым проектом 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"
«неполная структурированная конструкция в или перед этой точкой в выражении» для последней строки (результата).
Я добавлю, что мне пришлось немного попотеть, чтобы аннотировать типы, поскольку по какой-то неизвестной мне причине компилятор мог правильно выводить для первого списка, но для второго тип всегда выводился как единица. Также, моя оригинальная версия не связывала имя результата, а просто «возвращала выражение», как в
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», говоря, что «Это выражение имеет тип единицы, но здесь используется с типом double» и что «if» возможно с неправильным отступом.
Я думаю, что когда я увижу решение этой проблемы, я буду чувствовать себя глупо, но я застрял на такой простой проблеме более часа, поэтому я прошу вашей помощи.
Заранее спасибо!
ps: я проверил, что вкладки правильно интерпретируются как пробелы в меню Сервис-> Параметры -> .... -> F # -> Вкладки
pps: это мой первый вопрос по SO: -)