#haskell
Вопрос:
Я пытаюсь создать функцию, которая строит список на основе длины n, некоторого начального значения и строит остальную часть списка, применяя некоторую функцию/операцию к предыдущему значению . Например:
n = 5, начальное значение = x, -> [x, fx, … ]
Я понимаю, что для составления списка размера n вы можете просто использовать replicate, чтобы предоставить вам список, но, возможно, это не лучший способ добиться этого.
Код:
buildList::Int -> (b -> b) -> b -> [b]
buildList len func initial = replicate len something here
Не знаю, что будет после «лен».
ПРАВКА: Спасибо за помощь. iterate
это гораздо лучший вариант для подобной задачи, так как значения будут постоянно повторяться при использовании replicate
.
Комментарии:
1. Часто это хорошее начало, чтобы проверить Хугла, есть ли что-то, что может иметь отношение к вашей проблеме. (b -> b) -> b -> [b]» rel=»nofollow noreferrer»> В этом случае поиск вашей подписи дает некоторые результаты, но намекает на то, что удаление аргумента может вас куда-то привести.
n
И действительно , b) -> b -> [b]» rel=»nofollow noreferrer»> поиск(b -> b) -> b -> [b]
урожаяiterate
, который был бы вам большим подспорьем.2. @amalloy, как это намекает на это?
3. @dfeuer Результаты предназначены для
iterateN
того , чтобы предположить существование функции с именемiterate
, достаточно популярной, чтобы ее варианты были определены.
Ответ №1:
replicate
будет повторять одно и то же значение несколько раз. Это не имеет особого смысла, так как мы начинаем с x
, f x
f (f x)
, и т. Д.
Мы можем использовать iterate :: (a -> a) -> a -> [a]
эту волю для iterate f x
построения бесконечного списка [x, f x, f (f x), f (f (f x))), …]
.
Затем мы должны ограничить список первыми N пунктами. Я оставляю это как упражнение, чтобы сделать это. Таким образом, функция выглядит следующим образом:
buildList :: Int -> (a -> a) -> a -> [a]
buildList len func initial = … (iterate func initial)
где вам все еще нужно реализовать …
часть.
Комментарии:
1. Отличный совет, спасибо. использование
take
решило бы проблему с размером, я полагаю!2. @user1612508: можете ли вы объяснить, как вы определили
buildList
?3. он определяется следующим образом
buildList::Int -> (b -> b) -> b -> [b]
4. @user1612508: но реализация функции?
5.
buildList 4 x 1
вот как я это назвал