cpp2hskl - Volkards C++ Kurs nach Haskell übersetzen: Lektion 1-4


  • Mod

    Die ersten Lektionen wären noch (fast) ziemlich einfach,

    Lektion 1
    Compiler -> http://www.haskell.org/platform/
    Aufruf
    z.B.: ghc -o kraeuterh. kraeuterh.hs oder
    z.B.: ghc --make kraeuter.hs
    z.B.: runghc kraeuterh < Beispiel.txt oder
    z.B. ghci aufrufen, Module oder Programme laden mit

    Prelude> :l kraeuterh.hs
    

    bzw.

    Prelude> :m +kraeuterh
    

    falls das Modul so heißt
    An vielen Unis gibt es Nutzeranleitungen für Compiler oder Interpreter wie z.B.
    http://www.mathematik.uni-marburg.de/~loogen/Lehre/ws05/PraktischeIII/HugsIntro.pdf
    oder eben Real World Haskell (englisch)
    http://book.realworldhaskell.org/read/getting-started.html

    Lektion 2

    void main()
    {
    };
    

    Übersetzung:
    Da hatte ich zuerst gedacht, 909090...

    supar DB 53 dup 90h
    

    Aber Haskell?
    Nagut, ein generalisierter Spruch wäre dann wohl:

    module Main where
    main:: IO ()
    main = ...
    

    In der ghci-Konsole (ghci-"REPL") (siehe hierzu auch http://stackoverflow.com/questions/8676331/how-to-run-a-haskell-file-in-interpreted-mode ) kann man sich mit

    prelude>:set +t /prelude>: unset +t
    

    die Typenanzeige ein- und ausschalten (Im Hugs-Interpreter geht auch :set -t). Sehr nützlich!. Wie auch der Aufruf

    prelude>:info meineFunktion
    

    Im ghci wird eine Funktion mit let definiert z.B. angenommen, man läd das Modul Data.Ratio mit :m + Data.Ratio dann ginge sowas wie:

    prelude> let celsiusFahr t = 9%5 * t + 32
    

    Lektion 3

    #include <iostream>
    using std::cout;
    using std::endl;
    void main()
    {
       // Dies ist das Hello-World-Programm
       cout<<"Hello, world!"<<endl;
    };
    
    -- ein zentrales Codeelement wäre bestimmt:
     putStrLn "Hallihallo Haskell!"
    -- die Funktion putStrLn entspricht dem Ausdruck putStr\n
    -- wollte man über mehrere Absätze schreiben, dann mit {-...-} hätte aber hier
    -- Sternchenfähnchen vielleicht doch als etwas sinnvoller empfunden
    

    aber im ghci ist nicht minder interessant (aus Haskell in 10 Minuten);

    Prelude> do { putStrLn "ABCDE" ; putStrLn "12345" }
    

    oder eben:

    Prelude> putStrLn "Hello World "++ "Hello Happy Haskell World " ++ "!"
    

    (wenns nicht klappt (Typanzeige beachten), Klammern um den String setzen oder einfach $ vor den String setzen, als Klammerersatz)

    Lektion 4

    #include <iostream>
    using std::cout;
    using std::endl;
    void main()
    {
       cout<<"Es kommt ein Mann zum Baecker und sagt: Ich moechte 99 Broetchen."<<endl;
       cout<<"Da fragt der Baecker: Duerfen es auch 100 sein?"<<endl;
       cout<<"Der Mann antwortet: Nein, wer koennte denn so viele essen?"<<endl;
    };
    

    Übersetzung:
    Um mehrere Ein- oder Ausgabefehle aneinanderzuketten (zu "sequenzieren")(wobei sequenzieren nicht genau passt, wie wäre es mit "Koffer packen"?, ich packe...) kann man das Schlüsselwort "do" verwenden. Man kann entweder mit Einrückung arbeiten, oder mit {Befehl1;B2;..;Bn} Ganz gut dokumentiert ist die do Syntax (und die In/Out-Monadenhintergrundsyntax) hier: http://en.wikibooks.org/wiki/Haskell/do_Notation und z.T. hinterfragt hier: http://www.haskell.org/haskellwiki/Do_notation_considered_harmful Es ginge aber auch, einfach mehrere Befehle in eine Liste packen ... und eine nette Libfunktion dazunehmen wie "sequence" ...oder was einem auch immer noch dazu einfällt, was man noch so alles mit Listen anstellen könnte...;)

    main = do
       putStrLn "Es kommt ein Mann zum Baecker und sagt: Ich moechte 99 Broetchen." 
       putStrLn "Da fragt der Baecker: Duerfen es auch 100 sein?"
       putStrLn "Der Mann antwortet: Nein, wer koennte denn so viele essen?"
    

    Edit: Habe die Importbemerkungen mal weggelassen (weil im größeren Bild (inklusive Exportregelungen) vielleicht etwas undurchsichtig (Versuch: später nochmal drauf zurückkommen), habe dafür aber dem C++-Code Strukturen zu Namensräumen hinzugefügt 😉



  • Was ist denn das für ein wirrer Monolog?


Log in to reply