ishak lahlouh
ishak lahlouh

Reputation: 65

how to do this in haskell ? [x^0,x^1,x^2,x^3 ...]

i want to have a list like this one

[x^0,x^1,x^2,x^3 ...] 

is it possible to have such a list

for example

 ex : x = 2   [1,2,4,8,16,32 ..] 

Upvotes: 2

Views: 175

Answers (3)

fp_mora
fp_mora

Reputation: 714

In Haskell, the list is linear no matter the progression. By linear, I mean non-recursive. The elements in the list are not dependent on one or more previous elements or an initial element.

In Haskell such lists are used very much. In Haskell there are two primary facilities for producing such lists. The first is map and it is effective without any filtering or recursion.

f b n = map (b^) [0..n]

The second is the list comprehension

f b n = [b^x|x<-[0..n]]

In both it is simple to set the limit or number of elements in the result. These could both be made into infinite lists if desired by excluding the n in both the left and right side of the equations.

Upvotes: 2

chi
chi

Reputation: 116139

You can use iterate or unfoldr to double a number many times. This could be more efficient than computing x^n for each n.

Below, I use x=2, but you can use any x.

> take 10 $ iterate (*2) 1
[1,2,4,8,16,32,64,128,256,512]
> take 10 $ unfoldr (\x -> Just (x,2*x)) 1
[1,2,4,8,16,32,64,128,256,512]

Also beware that bounded integer types such as Int will overflow pretty fast in this way.

Upvotes: 9

Erik Cupal
Erik Cupal

Reputation: 2935

Yes, it is pretty easy thing to do in haskell.

You create an infinite stream of positive numbers and then map over them with function n ↦ x^n

f :: Num a => a -> [a]
f x = fmap (\n -> x^n) [0..]

> take 10 (f 2)

[1,2,4,8,16,32,64,128,256,512]

Upvotes: 4

Related Questions