Haskell - вычисляет сумму функций, создавая функцию более высокого класса - PullRequest
0 голосов
/ 02 апреля 2019

Без использования импортированного кода (я могу использовать голову, tail, init, last, filter, map, fold, ., обычноосновные функции haskell) Я хочу создать функцию высшего порядка int, типа hof :: [Integer->Integer]->(Integer->Integer), с hof s = \n ->.... (используя лямбду), которая реализует следующую математическую формулу

badly cropped photo of hand-written formula (извините, это написано от руки)

Нужны некоторые базовые рекомендации для запуска, я думал о том, чтобы каждый раз выполнять рекурсивный вызов функции hof, которая сама должна реализовывать измененную математическую формулу (которую я дал), подходящуюдля рекурсивных хвостовых вызовов.

некоторые результаты, которые должны быть получены:

Main> map (hof [(+1)]) [1..10]
[2,3,4,5,6,7,8,9,10,11]

Main> map (hof [(+1),(+2)]) [1..10]
[3,4,6,7,9,10,12,13,15,16]

Main> map (hof [(2^),(2^),(2^),(2^),(2^)]) [5..12]
[42,85,170,341,682,1364,2728,5456]

Main> map (hof [(*2),(+100),(^3),negate,(mod 100)]) [24..40]
[2768,3151,3567,4020,4509,5038,5609,6221,6876,7575,8322,9117,9960,10855,11805,
12806,13863]

Main> map (hof [(mod 100),negate,(+100),(^3),(*2)]) [24..40]
[1181,1351,1562,1767,1989,2230,2490,2771,3071,3395,3774,4145,4539,4958,5402,5873,6369]

Main> map (hof [(‘mod‘ i) | i<-[50..100] ]) [1000..1030]
[23,24,27,28,30,32,35,36,39,40,37,38,40,41,44,45,47,48,52,53,55,31,33,35,37,39,42,
45,46,48,47]

Спасибо за чтение!

1 Ответ

0 голосов
/ 02 апреля 2019

Допустим, у вас есть список функций:

fs = [f1, f2, f3, f4, f5] -- or more

Теперь для каждого значения i от 0 до бесконечности мы хотим применить функцию от fs к соответствующему n - i, затем разделить это значение на 2 i , и мы хотим суммировать полученные этажи.

hof fs = \n -> sum [ fi (n-i) `div` (2^i) | (fi, i) <- zip fs [0..]]

Даже если [0..] является бесконечным списком, результат zip fs [0..] является конечным, ограниченным длиной fs.

Чтобы избежать повторных умножений для каждой последовательной степени 2, используйте функцию iterate, чтобы вычислить последовательность из них для zip вместе с fs и [0..]

hof fs = \n -> sum [fi (n-i) `div` k | (fi, i, k) <- zip3 fs [0..] (iterate (*2) 1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...