Haskell创建一个具有特定增量的列表

时间:2012-11-20 21:01:08

标签: haskell

在数学语言中,您可以按如下方式创建矢量:

x = seq(0, 2*pi, length.out = 100)

输出:

[1] 0.00000000 0.06346652 0.12693304 0.19039955 0.25386607 0.31733259 0.38079911
  [8] 0.44426563 0.50773215 0.57119866 0.63466518 0.69813170 0.76159822 0.82506474
 [15] 0.88853126 0.95199777 1.01546429 1.07893081 1.14239733 1.20586385 1.26933037
 [22] 1.33279688 1.39626340 1.45972992 1.52319644 1.58666296 1.65012947 1.71359599
 [29] 1.77706251 1.84052903 1.90399555 1.96746207 2.03092858 2.09439510 2.15786162
 [36] 2.22132814 2.28479466 2.34826118 2.41172769 2.47519421 2.53866073 2.60212725
 [43] 2.66559377 2.72906028 2.79252680 2.85599332 2.91945984 2.98292636 3.04639288
 [50] 3.10985939 3.17332591 3.23679243 3.30025895 3.36372547 3.42719199 3.49065850
 [57] 3.55412502 3.61759154 3.68105806 3.74452458 3.80799110 3.87145761 3.93492413
 [64] 3.99839065 4.06185717 4.12532369 4.18879020 4.25225672 4.31572324 4.37918976
 [71] 4.44265628 4.50612280 4.56958931 4.63305583 4.69652235 4.75998887 4.82345539
 [78] 4.88692191 4.95038842 5.01385494 5.07732146 5.14078798 5.20425450 5.26772102
 [85] 5.33118753 5.39465405 5.45812057 5.52158709 5.58505361 5.64852012 5.71198664
 [92] 5.77545316 5.83891968 5.90238620 5.96585272 6.02931923 6.09278575 6.15625227
 [99] 6.21971879 6.28318531

如何在Haskell中实现这一目标?

我尝试创建一个lambda函数并将其与map一起使用,但我无法获得相同的输出。

由于

let myPi = (\x -> 2*pi)
map myPi [1..10]

2 个答案:

答案 0 :(得分:10)

嗯,你可以做到

[0, 2*pi/100 .. 2*pi]

请注意,这在性能和浮点舍入方面都不理想(因为它转换为enumFromThenTo),Daniel Fischer的版本更好(转换为enumFromTo)。考虑一下,GHC可能会将两者编译成几乎同样快速的代码,但我不确定。如果它真的性能至关重要,那么最好不要使用列表,例如Data.Vector


正如Jakub Hampl所说,Haskell可以处理无限列表。这对你来说可能没什么用处,但它会打开有趣的可能性 - 例如,你可能不确定你真正需要哪种分辨率。您可以让您的列表以非常低的分辨率开始,然后向后折叠并以较高的分辨率重新开始。实现这一目标的一种简单方法:

import Data.Fixed

multiResS₁ = [ log x `mod'` 2*pi | x<-[1 .. ] ]

使用它来绘制正弦函数,如下所示

  

Prelude Data.Fixed Graphics.Rendering.Chart.Simple&gt;让domainS 1 =取200个multiResS 1
  Prelude Data.Fixed Graphics.Rendering.Chart.Simple&gt; plotPNG“multiresS1.png”domainS 1 sin

enter image description here

答案 1 :(得分:7)

最简单的是列表理解,

[(2*pi)*k/99 | k <- [0 .. 99]]

(与k/99的乘法减轻了浮点舍入,因此最后一个值恰好是2*pi。)