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でこれをどのように達成できますか?

ラムダ関数を作成して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 は無限リストを処理できます。ここではおそらくあまり役​​に立ちませんが、興味深い可能性が開かれます。たとえば、実際に必要な解像度がわからない場合があります。リストを非常に低い解像度で開始してから、元に戻してより高い解像度でやり直すことができます。これを実現する簡単な方法の 1 つ:

import Data.Fixed

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

これを使用して正弦関数をプロットすると、次のようになります

Prelude Data.Fixed Graphics.Rendering.Chart.Simple> let domainS₁ = take 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 に答える