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.
-
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?
-
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