下面给出了一个用于生成递归序列的小型haskell函数。我在使用floor函数时遇到类型错误。我想,楼层功能正在期待RealFrac。代码和错误如下所示。
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'
答案 0 :(得分: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
的预期类型是什么(没有序列;))?