あなたはGHCが-ddump-asm
で生成したコードを調べることができます。
このプログラムコンパイルします。次に、12345
の検索をasm-output
を見て、あなたはこのループが表示されます
$ ghc -O2 Main.hs -ddump-asm > asm-output
:
_c47b:
addq %r14,%rsi
incq %r14
_c476:
cmpq $12345,%r14
jne _c47b
このショーで
main = print $ 1.0/fromIntegral (sum [(1::Int)..12345])
をリスト[1..12345]
は実際には作成されていません。
更新あなたが三角数の逆数を合計することを目的と思わ
、 すなわち1/1 + 1/3 + 1/6 + ...それはあなたが書くことを意図し、次のとおりです。
我々が無い間ことをもう一度見生成されたアセンブリを調べる
main = print $ sum $ map (\x -> 1/(fromIntegral x)) $ scanl (+) 1 [(2::Int)..12345]
:これは、ようHaskellで表現することができる
sum += 1.0/(double) n;
仲介リストが作成されます。ここでは
_c4ao:
cvtsi2sdq %rsi,%xmm0
movsd _n4aP(%rip),%xmm2
divsd %xmm0,%xmm2
addsd %xmm2,%xmm1
incq %r14
_c4ad:
addq %r14,%rsi
cmpq $12345,%r14
jne _c4ao
%r14
は%rsi
が変数n
と%xmm1
はアキュムレータsum
であり、あなたのCコード内のカウンターi
です。
ハスケルはおそらくそれを実体化せずにリストを反復することができるので、無駄なスペースはありません。 – Thilo
@Thiloでもそれを念頭に置いていても、まだ計算には少しの変異が必要です。 *私たちがC *で 'const 'の全てをマークしていない理由。議論ではなく、すべての不変のアイデアが時々私をかすめる。しかし、私の疑いをクリアするためにありがとう! :) – GauravP
@GauravP - 'n 'の逆数を合計する場合、Cコードを修正する必要があります:' sum + = 1 /(double)n' – ErikR