Exponentiality using a list

I am trying to solve the following exercise (I am studying Haskell):

Define x ^ n using list comprehension.

And I'm struggling to find a solution.

Using recursion or folding, the solution is not complicated (for example, foldr (*) 1 [x | c <- [1..n]]). However, using only a list comprehension, this becomes difficult (at least for me).

To solve the problem, I am trying to create a list of elements x ^ n and then get the length. Creating a list of elements x * n is easy, but I cannot generate a list of elements x ^ n.

ppower x n = length [1 | p <- [1..x], c <- [1..n]]

returns a list of x * n elements giving an incorrect result. Any ideas on this would be appreciated.

+4
source share
3 answers

@n.m, ( " ", , , ) / . , , :

, x ^ n . x ^ n = [x | c < - [1..n]] .

, , , ( ):

foldr (*) 1 [x | c <- [1..n]]

x ^ n ( ), , @David Fletcher @n.m , .

0

sequence:

length (sequence [[1..x] | _ <- [1..n]])

sequence, , :

sequence [xs1, ... , xsk] = [[x1, ... xk] | x1 <- xs1, ... , xk <- xsk]

, sequence .


, . , , - . :

, x n , , x ^ n x n.

, , expr ub (expr, m) = m ^ k, m - , , k - , expr.

( , m max x n.)

, ( ..).

, [x..y], , x <= m y <= m, <= m, <= m. , ub ([x..y], m) = m ^ 1.

- :

[eleft | x1 <- e1, ... , xk <- ek]

, e1 *... * length ek, e1 - ek, m ^ - , (m ^ i) ^ k = m ^ (i * k).

, , eleft ub (eleft, m ') = m' ^ j. x1 ... xk. m ^ - , , m '= m ^ , , ub (eleft, m) = (m ^ i) ^ j = m ^ (i * j)

e ub (e, m) = m ^ (i * j * k).

( , , ), let ( , , ), [x,37,x,x,n] ( m ).

, [x..] [x,y..], . head filter, , , , , . , 1. - 2. , . .

+3

Perhaps you can do the following:

pow :: Int -> Int -> Int
pow 0 _ = 1
pow 1 x = x
pow n x = length [1 | y <- [1..x], z <- [1..pow (n-1) x]]

therefore pow 3 2will return 8

0
source

Source: https://habr.com/ru/post/1675402/


All Articles