Einführung in Haskell



  • Hallo c-plusplus Board,

    nach dem ich nun seit drei Stunden verzweifel und Google auch nicht
    gefolgen hat, habe ich mich entschlossen hier anzumelden.

    Ich habe zum WS12/13 angefangen Informatik zu studieren und irgendwie kam
    die Studienleitung auf die tolle Idee mit Haskell als Programmiersprache
    zu starten.

    Unsere Professorin kommt leider nicht aus Deutschland weswegen ich so manche
    Schwierigkeiten habe sie zu verstehen, da ich auch nicht aus Deutschland
    kommt und sie sehr oft nuschelt oder nicht laut und deutlich redet.

    Kommen wir nun zu meinem Problem, wir haben letzte Woche ein Übungsblatt bekommen
    und in der einen Aufgabe sollen wir eine Funktion schreiben welche uns sagt ob
    eine Variable n gerade ist oder nicht.

    Die Lösung die ich nun gefunden habe lautet:

    odd :: Integer -> Bool
    odd n = div n 2 == 1
    

    jedoch weiß ich nicht wie der make befehl für Haskell lautet um zu testen,
    ob meine Funktion funktionieren oder ich in der Commandozeile des Interpreters
    einen Wert für n festlegen kann.

    ich habe die Datei bisher nur mit :load odd.hs geladen

    Außerdem bin ich auf der Suche nach einem guten Buch das mir den Einstieg
    erleichtert, um besser das Thema zu verstehen.

    Vielen Dank Insygnium



  • Insygnium schrieb:

    Die Lösung die ich nun gefunden habe lautet:

    odd :: Integer -> Bool
    odd n = div n 2 == 1
    

    Was meinst du mit "gefunden"? (Die Lösung ist falsch.)

    jedoch weiß ich nicht wie der make befehl für Haskell lautet um zu testen,
    ob meine Funktion funktionieren oder ich in der Commandozeile des Interpreters
    einen Wert für n festlegen kann.

    ich habe die Datei bisher nur mit :load odd.hs geladen

    In ghci? Das ist doch schonmal gut. Dann kannst du ja mit testen loslegen:

    odd 0
    --> sollte False ergeben
    odd 1
    --> sollte True ergeben
    odd 8247989582
    --> sollte False ergeben
    usw.
    

    Außerdem bin ich auf der Suche nach einem guten Buch das mir den Einstieg
    erleichtert, um besser das Thema zu verstehen.

    Wurden in der Vorlesung keine Bücher genannt?



  • Bashar schrieb:

    Was meinst du mit "gefunden"? (Die Lösung ist falsch.)

    Mit gefunden meinte ich, Lösung auf die ich gekommen bin.
    Tut mir leid, habe noch ein wenig Probleme mit Deutsch schreiben,
    kann aber es sehr gut verstehen.

    In ghci? Das ist doch schonmal gut. Dann kannst du ja mit testen loslegen:

    odd 0
    --> sollte False ergeben
    odd 1
    --> sollte True ergeben
    odd 8247989582
    --> sollte False ergeben
    usw.
    

    Ich benutze WinGHCI gibt es da einen Unterschied?
    Unsere Professorin benutzt auch immer WinGHCi anstatt
    von ghci, deswegen benutze ich auch das.

    wenn ich odd 0 eingebe dann gibt er folgendes aus:

    <interactive>:9:1:
        Ambiguous occurrence `odd'
        It could refer to either `Main.odd', defined at odd.hs:2:1
                              or `Prelude.odd',
                                 imported from `Prelude' at odd.hs:1:1
                                 (and originally defined in `GHC.Real')
    

    Wurden in der Vorlesung keine Bücher genannt?

    Unsere Professorin meinte wir sollen nur regelmäßig zur Vorlesung
    erscheinen und alle Übungen bearbeiten, dann sollten wir keine
    Probleme haben, dem Lehrstoff zu folgen. Ich merke aber schon jetzt
    das ich nicht hinterherkomme, weil sie bestimmte Dinge nicht gut
    erklären kann. Wir dürfen auch keine Laptops in die Vorlesung mitnehmen,
    um direkt bestimmte funktionen zu Testen, es würde sie nur stören,
    wenn alle permanent am Tippen sind.

    Vielen Dank für deine Hilfe schon mal!

    Grüße Insygnium



  • Insygnium schrieb:

    Ich benutze WinGHCI gibt es da einen Unterschied?
    Unsere Professorin benutzt auch immer WinGHCi anstatt
    von ghci, deswegen benutze ich auch das.

    Kenne ich leider nicht, aber das dürfte sich nicht großartig von ghci unterscheiden.

    wenn ich odd 0 eingebe dann gibt er folgendes aus:

    <interactive>:9:1:
        Ambiguous occurrence `odd'
        It could refer to either `Main.odd', defined at odd.hs:2:1
                              or `Prelude.odd',
                                 imported from `Prelude' at odd.hs:1:1
                                 (and originally defined in `GHC.Real')
    

    Achso, eine odd-Funktion gibt es schon vordefiniert im Prelude-Modul. Dieses Modul wird standardmäßig geöffnet, so dass es einen Namenskonflikt zu deiner Funktion (das ist Main.odd) gibt.

    Du kannst sie entweder anders nennen (myOdd o.ä.), oder explizit Main.odd schreiben.

    Unsere Professorin meinte wir sollen nur regelmäßig zur Vorlesung
    erscheinen und alle Übungen bearbeiten, dann sollten wir keine
    Probleme haben, dem Lehrstoff zu folgen. Ich merke aber schon jetzt
    das ich nicht hinterherkomme, weil sie bestimmte Dinge nicht gut
    erklären kann. Wir dürfen auch keine Laptops in die Vorlesung mitnehmen,
    um direkt bestimmte funktionen zu Testen, es würde sie nur stören,
    wenn alle permanent am Tippen sind.

    http://learnyouahaskell.com/
    http://book.realworldhaskell.org/read/
    http://www.haskell.org/haskellwiki/Learning_Haskell



  • Bashar schrieb:

    nennen (myOdd o.ä.)

    Standard wäre odd' , also mit einem Apostroph dahinter.


  • Mod

    Bei Haskellübungen braucht man keinen Rechner, Papier und Bleistift reichen. Beispielwerte in den Programmcode eingeben und gucken, wie es weitergeht, ist der beste Weg zu verstehen (und auch Fehler zu entdecken). Die Vorlesungen und Übungen würde ich nicht verpassen wollen und möglichst viel vorarbeiten (um dann die wirklich nötigen Fragen stellen zu können).

    Im GHCI kann man Funktionen mit einem let davor definieren und ausprobieren:

    GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
    Loading package ghc-prim ... linking ... done.
    Loading package integer-gmp ... linking ... done.
    Loading package base ... linking ... done.
    Prelude> let myname = "Hugo Hastig"
    Prelude> let myhead  (x:xs) = x
    Prelude> myname
    "Hugo Hastig"
    Prelude> head myname
    'H'
    Prelude> myhead myname
    'H'
    

    .hs oder .lhs Files kann man einfach auf die Verknüpfung zum GHCI oder zum Hugs ziehen, dann werden sie in den Interpreter geladen. Bei mir geht auch Doppeltklicken.
    Aber was ist das eigentlich immer für eine komische Internetseite, die der ghci da oben aufdrängt? 😉


  • Mod

    naja, vielleicht noch was ergänzendes zu dem Thread hier:
    hoffen wir mal, dass TO seine erste Verwirrung überstanden hat, denn die "Lösung" war ja schon fast richtig.

    Korrekt steht sie im übrigens (Online-)Buch "Real World Haskell".
    http://book.realworldhaskell.org/read/types-and-functions.html

    -- file: ch02/RoundToEven.hs
    isOdd n = mod n 2 == 1
    

    TO hatte hier eigentlich nur div und mod vertauscht.
    Warum ich hier noch irgendeinen Senf dazugebe, ist, dass Haskell eben mehrere Seiten hat. Wäre z.B. auch gegangen:

    myodd = not.even
    

Log in to reply