2

Ich habe eine Frage bezüglich Haskell, ich habe versucht, eine Funktion auf eine halbe gerade Zahl nur in einer Liste und die endgültige Liste mit nur die gerade Zahl (n) erhalten modifiziert (halbiert) mit dem Rest des Elements blieb unberührt.Haskell Fehler "parse Fehler bei der Eingabe 'if'"

Aber wenn ich versuche, meinen Code zu kompilieren, gab ich einen Fehler mit der Aussage "error: parse error on input 'if'" und ich konnte die Lösung dafür nicht finden.

halfEvens :: [ Int ] -> [ Int ] 
halfEvens xs = [x|x<-xs] 
       if x mod 2 == 0 
       the x = x/2 
       else 
       x = x 
+0

Sorry, weil mein Code ein bisschen durcheinander ist. Also, was soll ich tun, damit meine Funktion so funktioniert, wie ich will? Hast du eine Empfehlung? – Wandy

Antwort

2

so viel von Ihrem ursprünglichen Code/Absicht wie möglich zu halten,

halfEvens xs = [x | x <- xs, x <- [ -- instead of x = ... 
       if x `mod` 2 == 0 
        then {- x = -} x `div` 2 
        else {- x = -} x ]] 

Seine Art wird als halfEvens :: Integral t => [t] -> [t] abgeleitet.

Lustige Sache ist, dass wir dort den gleichen Variablennamen verwenden dürfen, mit dem x <- [...] Konstrukt; es wird nur beschattet. Aber es ist in Ordnung, da wir uns ohnehin nur für den neuen Wert interessieren. So behandeln wir es mental als Variable "update", obwohl es in Haskell natürlich keine aktualisierenden Variablen gibt.

4

Ihr Code hat mehrere Probleme:

  • [x|x<-xs] nichts nützlich macht. Dies wird nur zu xs ausgewertet.
  • Wenn Sie mod als Infix-Operator verwenden, benötigt es Backticks darum
  • Sie können Variablen nicht neu zuweisen. then x = x/2 und x = x sind illegal in Haskell. obwohl

Das Hauptproblem ist die Tatsache, dass Sie eine leere Liste Verständnis haben ([x|x<-xs]) mit einem if Ausdruck nur irgendwie darunter schweben. Ich glaube, Ihre Absicht war es, die if in das Verständnis zu bringen. Etwas wie:

halfEvens :: [Int] -> [Int] 
halfEvens xs = [if x `mod` 2 == 0 then x `quot` 2 else x | x <- xs] 

Änderungen:

  • Ich versuche nicht, etwas neu zuzuweisen. Jedes Element wird zu dem Rest der Leiste ausgewertet (|).
  • / kann nicht mit ganzen Zahlen verwendet werden. obwohl Use quot or div for integer division.

main = do 
    putStrLn . show $ halfEvens [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] 

[1,1,3,2,5,3,7,4,9,0] 

Ihr Code zeigt einige ernsthafte Missverständnisse von Haskell. Ich empfehle, mit einem guten Buch zu sitzen und alle Beispiele auszuprobieren. Haskell ist keine einfache Sprache. Versuche nicht, es durchzueilen.

3

Sie möchten also eine Funktion anwenden, die gerade Zahlen halbiert, aber ungerade Zahlen übrig lässt.Wir können eine Funktion schreiben, das auf einem einzigen Int Transformation durchzuführen, mit even aus dem Vorspiel:

halfEven :: Int -> Int 
halfEven x | even x = x `div` 2 
      | otherwise = x 

Jetzt können wir diese Funktion über eine Liste von Intmap:

halfEvens :: [Int] -> [Int] 
halfEvens xs = map halfEven xs 

Oder gehen Sie Punkt frei :

halfEvens = map halfEven 

Oder eine Liste Verständnis verwenden:

halfEvens xs = [halfEven x | x <- xs] 
+0

Was hat die Karte gemacht? Wird der 'halfEven' wieder in die 'halfEvens' importiert? Oder in anderen Worten, den 'halfEven' den Wert von 'halfEven' zuweisen? – Wandy

+0

@Wandy 'map halfEven == \ xs -> [halbes x | x <- xs] '. – chepner

Verwandte Themen