Дэн как бы отдает это, но вот подсказка о том, как сделать это самостоятельно. Вы можете записаться по номерам:
0! = 1
n! = (n-1)! * n
Вы также можете рекурсировать структуру. Например, список имеет рекурсивную структуру, разбитую на два случая: пустой список и элемент, за которым следует остальная часть списка. Без определенного языка:
List := Item x List
| Nil
Item
отмечает заголовок списка, x
- значение, хранящееся в заголовке, а List
- хвост. В этой грамматике ваш список будет написан:
Item ( fn N -> N + 1 ) Item ( fn N -> 2 * N ) Nil
Правило для списка в синтаксисе, изобретенном вашим профессором, может быть записано рекурсивно как:
List := x ^ List
| #
Функция в списке должна проходить через эту структуру, что означает, что она обрабатывает каждый из двух случаев:
sum l:List = Nil -> 0
| Item x xs:List = x + sum xs
Рекурсия, в частности, является термином sum l:List = x + sum xs
. Написание этой функции с использованием синтаксиса профессора, оставленного в качестве упражнения.
В вашей задаче ваша метафункция принимает список функций и должна возвращать функцию. Рассмотрим каждый случай, пустой список и элемент (заголовок), за которым следует список (хвост). В последнем случае вы можете рекурсивно использовать свою функцию для получения функции из хвоста, а затем каким-то образом комбинировать ее с головой для возврата функции. Это суть, во всяком случае.