Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Int->Integer:键入对话错误_Haskell - Fatal编程技术网

Haskell Int->Integer:键入对话错误

Haskell Int->Integer:键入对话错误,haskell,Haskell,以下是我计算斐波那契数的代码: f' :: (Int -> Int) -> Int -> Int f' mf 0 = 0 f' mf 1 = 1 f' mf n = mf(n - 2) + mf(n - 1) f'_list :: [Int] f'_list = map (f' faster_f') [0..] faster_f' :: Int -> Int faster_f' n = f'_list !! n 当“n”很小时,它可以正常工作。要解决大数字的问题,我

以下是我计算斐波那契数的代码:

f' :: (Int -> Int) -> Int -> Int
f' mf 0 = 0
f' mf 1 = 1
f' mf n = mf(n - 2) + mf(n - 1)

f'_list :: [Int]
f'_list = map (f' faster_f') [0..]

faster_f' :: Int -> Int
faster_f' n = f'_list !! n
当“n”很小时,它可以正常工作。要解决大数字的问题,我希望将Int类型转换为Integer:

f' :: (Integer -> Integer) -> Integer -> Integer
f' mf 0 = 0
f' mf 1 = 1
f' mf n = mf(n - 2) + mf(n - 1)

f'_list :: [Integer]
f'_list = map (f' faster_f') [0..]

faster_f' :: Integer -> Integer
faster_f' n = f'_list !! n
使用此代码,我得到了错误:

Couldn't match expected type `Int' with actual type `Integer'
In the second argument of `(!!)', namely `n'
In the expression: f'_list !! n
In an equation for `faster_f'': faster_f' n = f'_list !! n
好吧,我已经正确理解了列表中元素的索引不能是整数类型。 好:

但现在我得到了一个错误:

Couldn't match expected type `Int' with actual type `Integer'
In the second argument of `(!!)', namely `n'
In the expression: f'_list !! n
In an equation for `faster_f'': faster_f' n = f'_list !! n
无法将预期的整数类型“与实际的整数类型”匹配 预期类型:整数->整数

  Actual type: Int -> Integer
In the first argument of `f'', namely `faster_f''
In the first argument of `map', namely `(f' faster_f')'
为什么??我怎样才能修好它

为什么?

因为f'需要一个整数->整数函数,但您发送它的速度更快,这是一个Int->整数函数

我怎样才能修好它

可能最简单的方法是使用Data.List中的genericIndex,而不是

为什么?

因为f'需要一个整数->整数函数,但您发送它的速度更快,这是一个Int->整数函数

我怎样才能修好它


可能最简单的方法是使用Data.List中的genericIndex,而不是

Integer是Int的无限类型,Int只保证覆盖-2^29到2^29-1的范围,但在大多数实现中,它是完整的32或64位类型。这就是为什么会出现第一个错误。第二个错误是因为!!是一个接受列表和Int的函数

(!!) :: [a] -> Int -> a
有很多其他的,也许更简单的方法来计算斐波那契数。下面是一个示例,它将所有斐波那契数的列表返回到指定的值。第一个调用由fibCall完成


如果只需要第n个Fibonacci数,请将[Integer]更改为Integer,将a:l更改为a。

Integer是Int的无限类型,Int只能保证覆盖-2^29到2^29-1的范围,但在大多数实现中,它是完整的32或64位类型。这就是为什么会出现第一个错误。第二个错误是因为!!是一个接受列表和Int的函数

(!!) :: [a] -> Int -> a
有很多其他的,也许更简单的方法来计算斐波那契数。下面是一个示例,它将所有斐波那契数的列表返回到指定的值。第一个调用由fibCall完成


如果您只需要第n个斐波那契数,请将[Integer]更改为Integer,将a:l更改为a。

最简单的方法是将参数设置为Int,因为它们是斐波那契数的索引,而不是数字本身,并将Integer仅用于输出:

f' :: (Int -> Integer) -> Int -> Integer
f' mf 0 = 0
f' mf 1 = 1
f' mf n = mf(n - 2) + mf(n - 1)

f'_list :: [Integer]
f'_list = map (f' faster_f') [0..]

faster_f' :: Int -> Integer
faster_f' n = f'_list !! n
当然,现在不能用Int范围之外的索引来处理Fibonacci数,但实际上,空间和时间很快就会用完

顺便说一下,如果您需要一个fib列表,通常的实现是

fibs :: [Integer]
fibs = 0 : scanl (+) 1 fibs
如果您只需要某些值,有一种类似于使用以下公式进行快速求幂的快速计算方法:

f(2n) = (2*f(n-1) + f(n)) * f(n) 
f(2n-1) = f(n)² + f(n-1)²

最简单的方法是将参数设为Int,因为它们是Fibonacci数的索引,而不是数字本身,并且仅对输出使用整数:

f' :: (Int -> Integer) -> Int -> Integer
f' mf 0 = 0
f' mf 1 = 1
f' mf n = mf(n - 2) + mf(n - 1)

f'_list :: [Integer]
f'_list = map (f' faster_f') [0..]

faster_f' :: Int -> Integer
faster_f' n = f'_list !! n
当然,现在不能用Int范围之外的索引来处理Fibonacci数,但实际上,空间和时间很快就会用完

顺便说一下,如果您需要一个fib列表,通常的实现是

fibs :: [Integer]
fibs = 0 : scanl (+) 1 fibs
如果您只需要某些值,有一种类似于使用以下公式进行快速求幂的快速计算方法:

f(2n) = (2*f(n-1) + f(n)) * f(n) 
f(2n-1) = f(n)² + f(n-1)²

从Int切换到Integer不会使代码更快;事实上,我希望它会变慢…问题不是速度,而是类型溢出。更快的f'100-与Int-type抱歉,我的错误;我误读了你写的东西:从Int到Integer的切换不会让你的代码更快;事实上,我希望它会变慢…问题不是速度,而是类型溢出。更快的f'100-与Int-type抱歉,我的错误;我误读了你写的:s