как это сделать в хаскеле? [x ^ 0, x ^ 1, x ^ 2, x ^ 3 ...] - PullRequest
0 голосов
/ 06 мая 2018

я хочу иметь такой список

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

возможно ли иметь такой список

например

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

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Вы можете использовать iterate или unfoldr, чтобы удвоить число много раз. Это может быть более эффективным, чем вычисление x^n для каждого n.

Ниже я использую x=2, но вы можете использовать любой 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]

Также следует помнить, что ограниченные целочисленные типы, такие как Int, будут таким образом довольно быстро переполняться.

0 голосов
/ 06 мая 2018

В Хаскеле, список является линейным независимо от прогрессии. Под линейным я подразумеваю нерекурсивный. Элементы в списке не зависят от одного или нескольких предыдущих элементов или начального элемента.

В Хаскеле такие списки используются очень часто. В Haskell есть два основных средства для создания таких списков. Первый - map, и он эффективен без какой-либо фильтрации или рекурсии.

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

Второе понимание списка

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

В обоих случаях просто установить предел или количество элементов в результате. При желании их обоих можно превратить в бесконечные списки, исключив n как в левой, так и в правой части уравнений.

0 голосов
/ 06 мая 2018

Да, это довольно легко сделать в Haskell.

Вы создаете бесконечный поток положительных чисел и затем отображаете их с помощью функции 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...