I am trying to make a function that builds a list based on length n, some initial value, and builds the rest of the list applying some function/operation to the previous value . For example:
n = 5, initial_value = x, -> [x, fx, ... ]
I understand that to make a list of size n you can simply use replicate to give you a list, but perhaps it is not the best way to achieve this.
Code:
buildList::Int -> (b -> b) -> b -> [b]
buildList len func initial = replicate len something here
Not sure what would come after "len".
CodePudding user response:
replicate will repeat the same value a number of times. That makes not much sense since we start with x, f x, f (f x), etc.
We can make use of iterate :: (a -> a) -> a -> [a] that will for iterate f x construct an infinite list [x, f x, f (f x), f (f (f x))), …].
We then should limit the list to the first N items. I leave it as an exercise to do this. The function thus looks like:
buildList :: Int -> (a -> a) -> a -> [a]
buildList len func initial = … (iterate func initial)
where you still need to implement the … part.
