2012-11-21 20 views
7

Sono un principiante di Haskell quindi potrei mancare qualcosa di base - scuse in quel caso, ma non riesco a scoprire cosa c'è che non va nel seguente codice e perché esso trabocca lo stack. È per trovare il numero più piccolo che sia ugualmente divisibile per tutti i numeri in [1..x], qui usando [1,2] (Project Euler Problem 5 è per [1..20]).Overflow dello stack in codice molto semplice

module Main where 

main::IO() 
main = do 
    putStrLn $ show s where s = func 1 

func :: Int -> Int 
func x 
    | foldr1 (&&) [x `mod` y == 0 | y <- [1..2]] == True = x 
    | otherwise = func x+1 

Suppongo che debba stampare "2".

Ho anche provato a utilizzare and [mod x y == 0 | y <- [1..2]] == True = x invece della prima guardia. In entrambi i casi sto ricevendo un sovraccarico di stack quando provo a farlo. Ho risolto il problema inserendo tutto nella sezione principale più una ulteriore comprensione delle liste, ma mi piacerebbe capire cosa c'è che non va in questo. Grazie!

+2

È possibile omettere '== True'. – Franky

risposta

14

Il problema (o almeno, un problema --- Non ho controllato per gli altri) è in questa linea:

| otherwise = func x+1 

si intende questo per essere

| otherwise = func (x+1) 

ma viene scandito come

| otherwise = (func x)+1 

applicazione Function ha una priorità maggiore rispetto a qualsiasi operatore.

+1

Mille grazie, l'ha risolto. È una strada scivolosa da Python a Haskell! –

Problemi correlati