2017-12-22 10 views
1

Ich möchte eine einfache Funktion schreiben, die eine Zeichenfolge aus der Konsole liest und sie in einen benutzerdefinierten Datentyp parst.Einfache Eingabefunktion Haskell

Mein Versuch:

data Custom = A | B Int | C String deriving Read 

getFormula::IO Custom 
getFormula = do 
    putStrLn("Introduce una formula: ") 
    toParse <- getLine 
    return read toParse::Custom 

Aber das funktioniert nicht, und ich weiß nicht, wie der resultierenden Übersetzungsfehler zu interpretieren. Wie behebe ich das? Was verstehe ich falsch darüber, wie IO-Funktionen funktionieren?


EDIT: Das ist der Fehler, den ich bekomme, wenn ich versuchen, die Datei in GCHI

test.hs:7:5: 
Couldn't match type ‘String -> a0’ with ‘Custom’ 
Expected type: String -> Custom 
    Actual type: String -> String -> a0 
The function ‘return’ is applied to two arguments, 
but its type ‘(String -> a0) -> String -> String -> a0’ 
has only three 
In a stmt of a 'do' block: return read toParse :: Custom 
In the expression: 
    do { putStrLn ("Introduce una formula: "); 
     toParse <- getLine; 
     return read toParse :: Custom } 

test.hs:7:5: 
Couldn't match expected type ‘IO Custom’ with actual type ‘Custom’ 
In a stmt of a 'do' block: return read toParse :: Custom 
In the expression: 
    do { putStrLn ("Introduce una formula: "); 
     toParse <- getLine; 
     return read toParse :: Custom } 
In an equation for ‘getFormula’: 
    getFormula 
     = do { putStrLn ("Introduce una formula: "); 
      toParse <- getLine; 
       return read toParse :: Custom } 
+1

Sie könnten 'readLn' direkt anstelle von' getLine' und 'read' verwenden. – 4castle

Antwort

2

Sie haben zwei Typfehler. Das zweite ist leichter zu verstehen:

getFormula::IO Custom 

getFormula erklärt Typ haben IO Custom.

return read toParse::Custom 

... aber hier behaupten Sie, der letzte Ausdruck hat den Typ Custom. IO Custom ist nicht dasselbe wie Custom, so beschwert sich der Compiler.


Übrigens ist Ihr Abstand ein bisschen komisch. Warum haben Sie :: rechts gegen Identifikatoren rechts und links gestaut?

return read toParse :: Custom 

sieht weniger überfüllt und auch weniger irreführend: Der :: Custom Teil auf der linken Seite auf den gesamten Ausdruck, nicht nur auf eine einzelne Variable.


Der erste Fehler ist ein bisschen verwirrt, aber es enthält einen wichtigen Hinweis: The function ‘return’ is applied to two arguments.

return nur ein Argument:

return read toParse 

return (read toParse) 

Um sein sollte auch die Art Anmerkung zu beheben, können Sie eine der folgenden Optionen verwenden:

  • Ein bisschen klobig:

    return (read toParse) :: IO Custom 
    
  • Leicht ordentlicheres (keine Notwendigkeit IO angeben):

    return (read toParse :: Custom) 
    
  • einfachste Lösung:

    return (read toParse) 
    

    Sie brauchen nicht explizit eine Art hier überhaupt zu spezifizieren. Der Compiler weiß bereits, dass Sie nach einem Custom wegen der getFormula :: IO Custom Deklaration suchen.

2

Die return Funktionsargument zu laden hat, aber Sie geben es zwei - die erste ist read, die zweite ist toParse.

Verwenden Sie Klammern um die Anwendung zu spezifizieren:

return (read toParse :: Custom) 
Verwandte Themen