Я рассматриваю это как общий вид факторной функции в Haskell:
factorial :: (Integral a) => a -> a
factorial n = product [1..n]
Я понимаю, что это самый элегантный способ, но когда я пишу свою собственную рекурсивную функцию, это значительно медленнее:
factorial :: (Integral a) => a -> a
factorial 1 = 1
factorial n = n * factorial (n - 1)
Не первое решение должно делать почти все, что делает первый, внутри? Как это происходит быстрее? Можно ли написать что-то так же быстро, как первое решение, не используя нотацию заметок или функцию продукта?