2012-11-11 16 views
12

Ich fange gerade an, mich selbst zu unterrichten Haskell. Dieser Code soll Primfaktorzerlegung machen:Haskell - Definieren einer Funktion mit Wachen in einem 'wo'

divides :: Integer -> Integer -> Bool 
divides small big = (big `mod` small == 0) 

lowestDivisor :: Integer -> Integer 
lowestDivisor n = lowestDivisorHelper 2 n 
    where lowestDivisorHelper m n 
     | (m `divides` n) = m -- these should belong to lowestDivisorHelper 
     | otherwise = lowestDivisorHelper (m+1) n 

primeFactors :: Integer -> [Integer] 
primeFactors 1 = [] 
primeFactors n 
    | n < 1 = error "Must be positive" 
    | otherwise = let m = lowestDivisor n 
        in m:primeFactors (n/m) 

Ich erhalte einen Parsefehler auf der kommentierten Linie. Ich denke mein Problem könnte sein, dass lowestDivisorHelper Wachen hat, aber der Compiler weiß nicht, ob die Wachen zu lowestDivisorHelper oder lowestDivisor gehören. Wie komme ich hier zurecht?

Bearbeiten: Ich sollte hinzufügen, dass ich nicht die Hilfsfunktion auf der obersten Ebene definieren wollte, um die Implementierungsdetails zu verbergen. Der Import der Datei sollte nicht die Hilfsfunktion übernehmen.

+3

"Das Importieren der Datei sollte die Hilfsfunktion nicht übernehmen." In diesem Fall exportieren Sie es einfach nicht. –

Antwort

16

Sie müssen eine neue Anweisung mit Ihrer Hilfsfunktion starten, damit die Guards durch Vergleich ausreichend eingerückt werden. (. Und Sie vergessen auch ein Argument, n) Dies würde auch funktionieren:

lowestDivisor :: Integer -> Integer 
lowestDivisor n = lowestDivisorHelper 2 n 
    where 
    lowestDivisorHelper m n 
     | (m `divides` n) = m -- these should belong to lowestDivisorHelper 
     | otherwise = lowestDivisorHelper (m+1) n 

aber nicht:

lowestDivisor :: Integer -> Integer 
lowestDivisor n = lowestDivisorHelper 2 n 
    where lowestDivisorHelper m n 
     | (m `divides` n) = m -- these should belong to lowestDivisorHelper 
     | otherwise = lowestDivisorHelper (m+1) n 

Der entscheidende Punkt ist, dass die | weiter sein muss, um das Recht als der Funktionsname.

Im Allgemeinen wird beim Starten einer neuen Zeile die vorherige fortgesetzt, solange sie weiter rechts liegt. Die Wachen müssen vom Funktionsnamen weitermachen.

+0

Ah, ich habe gerade einen Kommentar geschrieben, dass dein letztes Beispiel in Ordnung war. – Vitus