2017-02-04 2 views
-3

Я попытался реализовать последовательность Тейлора для экспоненциальной функции, и я получаю огромную нагрузку на ошибки, которые я не совсем понимаю, поскольку все сегменты кода сами по себе работают ... Может кто-нибудь объяснить ошибку и обходной путь:Последовательность Тейлора для экспоненциальной функции в Haskell

top x = map (x^) [0..] 
bottom = foldr (*) 1 [1..] 
whole x = zipWith (/) (top x) bottom 

Заранее благодарен!

+0

Может быть, только я устал, я проработал через 10 часов сегодня, так что это может быть просто что-то действительно немое, если это так, пожалуйста, извините меня – Fapprentice

+0

ваш вопрос кажется неполным, как это связано с 'Taylor series'? Возможно, вы захотите добавить более полный ([MCVE] (http://stackoverflow.com/help/mcve)) код. – wizzup

+0

Последовательность Тейлора представляет собой последовательность для вычисления экспоненциальной функции/sin/cos и т. Д., Как указано в вопросе, мой код был связан с последовательностью Тейлора для экспоненциальной функции e^x. Я думал, что это будет общеизвестно, мне жаль, если это не так. Спасибо за ваше время, хотя – Fapprentice

ответ

6

Хорошо, я понял. Проблема заключалась в том, что bottom не был фактически списком всех возможных факториалов.

Чтобы решить эту проблему, я должен был использовать scanl вместо foldr:

bottom = scanl (*) 1 [1..] 
1

Вы можете проверить каждую функцию отдельно в GHCi, чтобы увидеть, если это то же самое, вы проектируете быть.

Например, ваше первое определение bottom

Prelude> bottom = foldr (*) 1 [1..] 
Prelude> :t bottom 
bottom :: (Num b, Enum b) => b 

не дает список. Это, очевидно, не правильный вход для zipWith

Prelude> :t zipWith 
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] 

По сравнению с правильным одной

Prelude> bottom = scanl (*) 1 [1..] 
Prelude> :t bottom 
bottom :: (Num b, Enum b) => [b] 

которые дают список.

Смежные вопросы