Haskell: Ошибка синтаксиса, которую я не могу понять
Решаю задачу по функциональному программированию, и мне нужно рассчитать сложный процент рекурсивно. Вот мой код, логично он описан более-менее правильно (хотя чувствую, что в функции которая будет рекурситься есть костыль):
countInterest :: (Integer, Float, Integer) -> (Float)
countInterest (period,interest,sum) = (result) where
result=sum+interest/30
timePeriod=period-1
if period == 0
then return result
else countInterest (timePeriod,interest,result)
main=do
putStrLn "Enter start sum:"
inputSum <- getLine
putStrLn "Enter interest amount by one period:"
inputInterest <- getLine
putStrLn "Enter period amount:"
inputPeriod <- getLine
let startSum=(read inputSum :: Int)
let interestByPeriod=(read inputInterest :: Int)
let periodAmount=(read inputPeriod :: Int)
let periodCounting=countInterest(periodAmount,interestByPeriod,0)
print(periodCounting)
let result = startSum*(1+periodCounting)^366
print("Result ", result)
Но я не могу его запустить, потому что мне постоянно выдаёт ошибку (не одну и ту же; от изменений, которые я делаю меняется и ошибка). На данный момент ругается на название функции main error message: parse error (possibly incorrect indentation or mismatched brackets)
Ответы (1 шт):
С точки зрения синтаксиса, ошибка здесь
countInterest (period,interest,sum) =
if period == 0
then result
else countInterest (timePeriod,interest,result)
where
result=sum+interest/30
timePeriod=period-1
Конструкция if/then это выражение, которое в зависимости от условия, принимает одно из двух значений. Как раз то, что вам нужно.
Не особо вдаваясь в подробности, замечу, что return здесь не нужен, а точнее, его здесь быть не должно. Это не синтаксическая ошибка, потому, что return – это не оператор, а функция (ох уж эти коварные хаскеллисты), но в этом месте программы применения не имеет.
В остальном же у вас несколько ошибок типов, которые в Haskell автоматически не приводятся, и их нужно указывать правильно (или не указывать вовсе: в большинстве случаев компилятор сможет вывести типы самостоятельно).
countInterest :: (Integer, Float, Float) -> (Float)
countInterest (period,interest,sum) =
if period == 0
then result
else countInterest (timePeriod,interest,result)
where
result=sum+interest/30
timePeriod=period-1
main=do
putStrLn "Enter start sum:"
inputSum <- getLine
putStrLn "Enter interest amount by one period:"
inputInterest <- getLine
putStrLn "Enter period amount:"
inputPeriod <- getLine
let startSum=(read inputSum :: Float)
let interestByPeriod=(read inputInterest :: Float)
let periodAmount=(read inputPeriod :: Integer)
let periodCounting=countInterest(periodAmount,interestByPeriod,0)
print(periodCounting)
let result = startSum*(1+periodCounting)^366
print("Result ", result)
Ну и последнюю строку вы, наверное, захотите записать иначе
putStrLn ("Result " ++ show result)
(По поводу стиля кода и правильности работы алгоритма – без комментариев)