Poor Man's Currying

Предадени решения

Краен срок:
24.10.2018 17:00
Точки:
10

Срокът за предаване на решения е отминал

Poor Man's Currying

В тази задача ще трябва да напишете няколко функции, които генерират други функции. Това е много подобно на currying с това, че фиксирате няколко от аргументите на операцията и след това използвате функции с по - малък брой аргументи.

Repeater

Функция, която приема string s и разделител sep и връща функция, която построява повторенията определен брой пъти и ги връща.

func Repeater(s, sep string) func (int) string

Която може да се използва по следния начин

Repeater("foo", ":")(3) // foo:foo:foo

Generator

Функция, създава "генератор" функция за int числа.

func Generator(gen func (int) int, initial int) func() int

На Generator се подава gen функция и първоначалната стойност в поредицата - initial. gen взима като аргумент предишно изчислената стойност и връща следващата.

Примерна употреба

counter := Generator(
    func (v int) int { return v + 1 },
    0,
)
power := Generator(
    func (v int) int { return v * v },
    2,
)

counter() // 0
counter() // 1
power() // 2
power() // 4
counter() // 2
power() // 16
counter() // 3
power() // 256

MapReducer

Функция, която създава map reducer функция за int аргументи с подадени map функция, reduce функция и първоначална стойност initial за reduce функцията.

func MapReducer(mapper func (int) int, reducer func (int, int) int, initial int) func (...int) int

Която може да бъде използвана по следния начин

powerSum := MapReducer(
    func (v int) int { return v * v },
    func (a, v int) int { return a + v },
    0,
)

powerSum(1, 2, 3, 4) // 30

Аргументите на reducer трябва да се подават от ляво на дясно. Иначе казано - напишете left-fold във вашата имплементация.

Напомняне

Не забравяйте, че предадените решения трябва да са в пакет main. Форматирайте кода си с gofmt.