2016-12-09 3 views
0

Dies ist, was ich bisher habe, ich bin mir ziemlich sicher, dass die Funktion selbst korrekt ist, aber ich bin verwirrt, was im main = do Block zu tun ist. Der Fehler, den ich bekomme, ist, dass die Funktion eine Ganzzahl will, aber ich gebe es stattdessen eine Zeichenfolge. Ich gehe davon aus, dass es mit dem getLine-Teil zu tun hat und dass ich nicht überprüfe, ob die eingegebene Zahl ein int ist.Wie schreibe ich ein Haskell-Programm, das die Primfaktoren einer bestimmten Zahl ausgibt?

factors :: Int -> [Int] 
factors n = [x | x <- [1..n], mod n x == 0] 
primeFactors :: Int -> [Int] 
primeFactors n = [x | x <- [1..n], mod n x == 0, isPrime x] 
isPrime x = (length (factors x)) == 2 
main = do 
    putStrLn "Enter a number." 
    number <- getLine 
    let x = factors number 
    putStrLn x 

Die Fehler, die ich bekomme, wenn ich diesen Code ausführen:

primeFactor.hs:9:19: error:

 
    • Couldn't match type ‘[Char]’ with ‘Int’ 
     Expected type: Int 
     Actual type: String 
    • In the first argument of ‘factors’, namely ‘number’ 
     In the expression: factors number 
     In an equation for ‘x’: x = factors number 
    

primeFactor.hs:10:12: error:

 
    • Couldn't match type ‘Int’ with ‘Char’ 
     Expected type: String 
     Actual type: [Int] 
    • In the first argument of ‘putStrLn’, namely ‘x’ 
     In a stmt of a 'do' block: putStrLn x 
     In the expression: 
     do { putStrLn "Enter a number."; 
      number <- getLine; 
      let x = factors number; 
      putStrLn x } 

+1

Bitte fügen Sie tatsächliche Fehlermeldungen in Ihre Frage ein, anstatt paraphrasierte oder gekürzte Versionen zu präsentieren. Sie sind wirklich nützlich. Die Fehlermeldung, über die Sie im Kommentar nachfragen, ist, weil putStrLn eine Zeichenfolge und x eine Liste von Einträgen, keine Zeichenfolge, wünscht. – amalloy

+1

Danke, ich bin ziemlich neu auf dieser Seite, ich werde dies bei zukünftigen Fragen beachten – Tyler

Antwort

3
let x = factors $ (read number :: Int) 
print x 

ODER

number <- readLn 

(dank @ Daniel)

Dies sollte die Arbeit machen.

+1

Oder, 'getLine' für' readLn' ausschalten. –

+0

Es wurde 1 Fehler behoben, aber ich bekomme immer noch "konnte nicht übereinstimmen Typ 'Int' mit 'Char' Erwarteter Typ: String, Tatsächlicher Typ: [Int] – Tyler

+0

@Tyler deshalb habe ich' putStrLn' durch 'print' ersetzt , Mann –

Verwandte Themen