2013-04-12 14 views
5

Haskell'i öğreniyorum ve this tutorial'dan gelen temel faktör fonksiyonuyla ilgili sorun yaşıyorum.Haskell temel faktörleri çıkmıyor mu?

Temelde, gibi bir çarpınımını tanımladığınız:

Prelude> let factorial 0 = 1 
Prelude> let factorial n = n * factorial (n - 1) 

tip kontrol eder: mantıklı

Prelude> :t factorial 
factorial :: Num a => a -> a 

. Ancak, bu işlevin davranışı yoktur. Giriş ne olursa olsun (interactive): out of memory sonucunu verir.

Prelude> factorial 5 
(interactive): out of memory 

ben bu hafıza hatası dışında olmasına yol açan sonsuz özyinelemeli çağrı olduğunu varsaymak var, ama muhtemelen buna neden olabilir emin değilim. Aynı şey açıkça bu 1 olarak ilan ettik rağmen factorial 0 ile gerçekleşir:

Prelude> factorial 0 
(interactive): out of memory 

Şimdi burada garip bir parçası: Bir dosyada faktöryel fonksiyonunu tanımlarsanız, iyi çalışıyor. Geri GHCi gidip :l tesths.hs çalıştırırsanız ben hatasız factorial 5 yürütebileceği, Sonra dosya tesths.hs s.t .:

factorial 0 = 1 
factorial n = n * factorial (n - 1) 

oluşturun.

Neler oluyor burda?

cevap

11

İki durumlu tek bir işlev yerine iki işlev tanımlandı. İlk olarak :set -Wall'u çalıştırın aynı komutları deneyin ve bir ad gölge uyarısı almalısınız. Sorunu çözmek için , bunun yerine,

let factorial 0 = 1; factorial n = n * factorial (n - 1) 

deneyin.

+0

Huh. Mantıklı, sanırım. Bu garip davranış olsa da. – Zyerah

+3

Oldu. "Hadi ..." diye ekledi. Bu kesinlikle ghci hakkında biraz garip olan bir şey değildir - bir sonucun 'a => a', 'a => IO a' ya da 'IO()' türüne göre değişir. – ScootyPuff

+0

Bu biraz mantıklı. Neredeyse her dilde gerekli olan girdinin türüne bağlıdır. – Zyerah

11

Ayrıca satırlı girişi vermek :{ ... :} sözdizimi kullanabilirsiniz:

Prelude> :{ 
Prelude| let factorial 0 = 1 
Prelude|  factorial n = n * factorial (n - 1) 
Prelude| :} 
Prelude> factorial 10 
3628800 
Prelude> 

Aynı şekilde, :set +m ile satırlı modunu ve girinti kullanabilirsiniz:

Prelude> :set +m 
Prelude> let factorial 0 = 1 
Prelude|  factorial n = n * factorial (n - 1) 
Prelude| 
Prelude> factorial 10 
3628800 
Prelude> 

Not boş satır. Çok satırlı modu :unset +m ile tekrar kapatabilirsiniz.

Bu belge ile ilgili dökümantasyon için bkz. Section 2.4.3 of the GHC User's Guide, "[Using GHCi with] Multiline input".

de bu güzel bir liner, olduğu
4

Not:

let factorial n = product [1..n] 
+3

http://www.willamette.edu/~fruehr/haskell/evolution.html – leftaroundabout