Как создать композицию функции на саму себя?

Здравствуйте. Имеется какая-то функция:
go f = execute f n
Параметр f - это какая-то функция (sin, cos etc.)

Функция execute устроена так:
execute f n = f . f . ... . f
Как мы видим, в коде функция execute устроена композиция функции f на саму себя n раз.
Как это можно описать на haskell'e?

Должны быть что-то вроде этого:
execute sin 2 = sin(sin(sin 2))
Или при n == 4
execute sin 4 = sin(sin(sin(sin(sin 4))

n == 1
execute f 1 = f( f(1))

Т.е. при заданном параметре n функция

P.S. Понимаю как описать композицию различных функции, но как описать композицию функции на саму себя n-раз не понимаю.
  • Вопрос задан
  • 2683 просмотра
Решения вопроса 1
Функция применяется n + 1 раз к n. Для этого надо список из n + 1 функций f свернуть при помощи композиции, а затем применить к аргументу. Добавим ещё fromIntegral, так как в примерах у вас синусы, которым нужно число с плавающей точкой, а n же у вас - целое (функцию можно применить только целое кол-во раз).

execute f n = foldr1 (.) (replicate (succ n) f) (fromIntegral n)


где replicate (succ n) f - список из n + 1 функций f, foldr1 (.) - свёртка списка композицией

Есть и второй вариант, не сворачивать n + 1 функций f через композицию, а сворачивать список, на каждом шаге сразу применяя к аргументу, т.е. так:

execute f n = foldr ($) (fromIntegral n) (replicate (succ n) f)


где ($) - функция применения, т.е. f $ x = f x
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы