Так что, будучи новичком в Clojure и в целом в функциональном программировании, я иногда (цитирую книгу) «чувствую, что ваш любимый инструмент у вас забрали». Пытаясь лучше понять эту вещь, я занимаюсь проблемами манипулирования строками.
Итак, зная, что функциональная парадигма - это все о рекурсии (и других вещах), я использовал хвостовые рекурсивные функции для выполнения своих задач. Обычно я делаю с циклами, затем пытаюсь реализовать, используя карту или уменьшить. Для тех, кто более опытен, это звучит как нормальное занятие?
Я начинаю разочаровываться, потому что сталкиваюсь с проблемами, когда мне нужно отслеживать индекс каждого символа при итерации по строкам, но это оказывается трудным, потому что уменьшение и отображение кажутся "изолированными". Я не могу увеличить значение, пока сокращается строка ...
Есть ли что-то, чего мне не хватает;функция именно для этого .. Или этот конкретный случай просто не может быть реализован с помощью этих основных функций? Или то, как я это делаю, просто неправильно и не функционально, вот почему я застрял?
Вот мой пример:
Эта функция занимает пятьразделяя строки, затем используя reduce
, строит вектор, содержащий все символы в позиции char-at в каждой строке. Как вы могли бы изменить этот код так, чтобы char-at (в анонимной функции) увеличивалась после прохождения каждой строки? Это то, что я подразумеваю под словом «изолированный», и я не знаю, как это обойти.
(defn new-string-from-five
"This function takes a character at position char-at from each of the strings to make a new vector"
[five-strings char-at]
(reduce (fn [result string]
(conj result (get-char-at string char-at)))
[]
five-strings))
Старый : «abc», «def», «ghi» »jkl "" mno "-> [adgjm] (всегда берется из индекса 0)
Изменено :" abc "" def "" ghi "" jkl "" mno "-> [aeijn] (indexувеличивается и возвращается назад)