在数学语言中,您可以按如下方式创建矢量:
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]
答案 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
答案 1 :(得分:7)
最简单的是列表理解,
[(2*pi)*k/99 | k <- [0 .. 99]]
(与k/99
的乘法减轻了浮点舍入,因此最后一个值恰好是2*pi
。)