2016-04-26 12 views
0

Ich habe eine sehr einfache Funktion namens "falten", die eine Funktion f und führt es aus. Wenn eine Funktion 'add' und zwei Zahlen gegeben sind, ruft sie add mit diesen zwei Zahlen auf und zeigt die Ergebnisse an. Ich kann es jedoch aufgrund eines Kompilierungsfehlers nicht kompilieren. Worin besteht der Fehler konkret und was kann ich tun, um es zu lösen?Haskell - Übergabe einer Funktion als Argument Kompilierungsfehler

module Main where 

    add x y = x + y 

    --fold :: ((a,b)->c) -> a->b->c 

    fold f n x = f n x 


    main :: IO() 
    main = do 
     fold add 2 3 

enter image description here

+0

Sie haben angegeben, dass 'main' ein' IO() 'zurückgeben soll. Was bringt 'falte add 2 3' zurück? Wie können Sie den zurückgegebenen Wert in ein 'IO()' umwandeln? –

+0

Wenn ich IO() zu Integer ändere gibt es "konnte nicht erwartet Typ 'IO t0' mit tatsächlichen Typ 'Integer'" – BDillan

Antwort

6

Das Problem ist, dass Sie main (richtig) als mit Typ IO() deklariert haben, aber fold das nicht zurück. Die Fehlermeldung ist ein wenig komplizierter, weil in Theorie, add (und damit fold) einen Wert vom Typ IO() zurückkehren konnte, da add jede Art mit einer Num Instanz zurückgeben kann. IO() ist jedoch nicht eine Instanz von Num. Die Lösung besteht darin, eine IO-Aktion zurückzugeben, die aus dem Rückgabewert fold erstellt wurde. Eine Möglichkeit dazu besteht darin, die Funktion print zu verwenden (die einen beliebigen Wert mit einer Show Instanz übernimmt und sie vor der Ausgabe in eine String konvertiert).

main = print $ fold add 2 3 
Verwandte Themen