Вот мой код для вычисления чисел Фибоначчи:Int -> Integer тип разговора недоразумение
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
Он отлично работает в то время как «п» мала. Для того, чтобы решить проблему с большими числами я хотел бы преобразовать 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
Ну, я правильно понял индекс элемента список не может быть целым. OK:
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' :: **Int** -> Integer
faster_f' n = f'_list !! n
Но теперь я получаю ошибку:
Couldn't match expected type
Integer' with actual type
Int' Expected type: Integer -> IntegerActual type: Int -> Integer In the first argument of `f'', namely `faster_f'' In the first argument of `map', namely `(f' faster_f')'
Почему? И как я могу это исправить?
Переключение с 'Int' на' Integer' будет * не * сделать ваш код быстрее; на самом деле, я бы ожидал, что он станет медленнее ... – ivanm
Вопрос не о скорости, а о переполнении типа. fast_f '100 - работает некорректно с типом Int – demas
Извините, моя ошибка; Я неправильно понял, что вы написали: s – ivanm