2015-11-14 3 views
1

Ниже приведена небольшая функция haskell, используемая для генерации рекурсивной последовательности. Я получаю ошибку типа при использовании функции floor. функция полов ожидает RealFrac, я полагаю. Код и ошибка приведены ниже.генерация рекурсивной последовательности (функция haskell)

main = do 
    print(funSeq 9) 

funSeq n = do 
    if (n<4) 
     then 1 
     else floor ((funSeq (n-1) + funSeq (n-2)) * (funSeq (n-3)/ funSeq(n-4))) 

Ошибка:

No instance for (RealFrac a0) arising from a use of 'funSeq' 

ответ

1

один простое решение, чтобы положить несколько fromIntegral сек там:

main :: IO() 
main = do 
    print(funSeq 9) 

funSeq :: Int -> Int 
funSeq n = do 
    if (n<4) 
     then 1 
     else floor (fromIntegral (funSeq (n-1) + funSeq (n-2)) * (fromIntegral (funSeq (n-3))/fromIntegral (funSeq(n-4)))) 

который дает

λ> :main 
78 

пытается привести в порядок это немного:

funSeq :: Int -> Int 
funSeq n 
    | n < 4 = 1 
    | otherwise = floor $ 
     (fromIntegral $ funSeq (n-1) + funSeq (n-2)) 
     * (fromIntegral . funSeq $ n-3)/(fromIntegral . funSeq $ n-4) 

но это немного трудно понять, что вы пытаетесь - что ожидаемый тип для вашего funSeq (который не является последовательностью;))?

+0

это просто функция, которая принимает Int и возвращает Int. – user65652

+0

У меня проблема с отступом, я думаю. его ошибка синтаксического анализа на | – user65652

+0

он скомпилировал для вас? – user65652