2

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

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]
4

2 回答 2

11

好吧,你可以做

[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> 让 domainS₁ = 取 200 multiResS₁<br> Prelude Data.Fixed Graphics.Rendering.Chart.Simple> plotPNG "multiresS1.png" domainS₁ sin

在此处输入图像描述

于 2012-11-20T21:03:31.507 回答
7

最简单的是列表理解,

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

(乘以k/99减轻浮点舍入,所以最后一个值正好是2*pi。)

于 2012-11-20T21:04:01.067 回答