Создайте список длиной N

#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 вот как я это назвал