ggT

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
noise
User
Beiträge: 62
Registriert: Donnerstag 7. Februar 2008, 00:15

BlackMamba hat geschrieben:Aber wie könnte man denn so eine Generatorfunktion schreiben? Gibts da Tutorials oder ähnliches zu?
Hi ich kenne mich mit Haskell nicht aus und kann daher deine definition von ``permut `` nicht lesen, aber zu Generatoren in Python kann ich was sagen.

Ein generator wird ganz einfach so definiert:

Code: Alles auswählen

>>> def gen(iterable):
	for elem in iterable:
		yield elem

		
>>> li = [1,2,3,4,5]
>>> gen(li)
<generator object at 0x00E8C9E0>
>>> it = gen(li)
>>> it.next()
1
>>> it.next()
2
>>> it = gen((1,2))
>>> it.next()
1
>>> it.next()
2
>>> it.next()

Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    it.next()
StopIteration
>>> for elem in gen(li):
	print elem

	
1
2
3
4
5
>>> 
Wie man sieht ist das entscheidende das `yield`. mit `next()` yielded man bei bedarf das nächste Element.

Zum Thema Generatoren hier ein bisschen lesestof:
http://www.python.org/dev/peps/pep-0255/
http://www.python.org/dev/peps/pep-0289/
http://www.python.org/dev/peps/pep-0342/
http://docs.python.org/whatsnew/pep-342.html

Ich muss gestehen ich bin ein großer Fan von Pythons Generatoren und benutze sie überall wo es nur geht. Seit 2.5 kann man mit den Generatoren auch "coroutines" schreiben, mit `send()`, `throw()` und `close()`.

HTH
noise
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Was gefällt dir denn an Haskell nicht? Ich bin gerade dabei, Haskell zu lernen und finds eigentlich ziemlich genial, wenn auch sehr ungewohnt.

Allerdings programmiere ich auch in Python meist recht funktional...nur halte ich mich da mit Rekursion zurück ;)
BlackMamba
User
Beiträge: 77
Registriert: Samstag 24. März 2007, 23:22
Wohnort: Germany,NRW,

@ audax:
Haskell an sich ist ja ganz ok...besonders weil man zum Beispiel viele mathematische Formeln quasie direkt in Haskell übernehmen kann.
Aber an der Uni macht das kein Spaß.
Kann dir ja gerne mal den Link mit den Übungsaufgaben und Unterlagen geben, aber Musikstücke zu programmieren mit Haskell, machen vielen von uns nicht ganz so viel Spaß...
Und was noch dazukommt, man braucht Haskell nie wieder. Vor drei Wochen hatten wir die letzte Vorlesung für Haskell, wir werden die Sprache das ganze Studium nie wieder gebrauchen und später glaube ich auch nicht.
BlackMamba
User
Beiträge: 77
Registriert: Samstag 24. März 2007, 23:22
Wohnort: Germany,NRW,

@ noise:

Danke für den Quellcode und die Links, muss ich mir heute nachmittag mal alles in Ruhe anschauen und ausprobieren.
BlackJack

Ich habe die `permut` mal 1:1 nach Python übersetzt. Dazu muss man im Quelltext von BlackMamba noch `Stadt` und `remove` definieren:

Code: Alles auswählen

import List
type Stadt = String

remove :: Stadt -> [Stadt] -> [Stadt]
remove y xs = xs \\ [y]

permut :: [Stadt] -> [[Stadt]]
permut [] = [[]]
permut xs = [ y:ys | y <- xs , ys <- permut (remove y xs) ]

main = putStrLn . unlines . map show $ permut ["Berlin", "Tokyo", "New York"]
In Python nahezu 1:1 "übersetzt" sieht das so aus:

Code: Alles auswählen

from pprint import pprint


def remove(y, xs):
    result = list(xs)
    result.remove(y)
    return result


def permut(xs):
    if not xs:
        return [[]]
    else:
        #      [ y  : ys |   y <- xs ,   ys <- permut (remove y xs) ]
        return [[y] + ys for y in xs for ys in permut(remove(y, xs))]


pprint(permut(['Berlin', 'Tokyo', 'New York']))
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

BlackMamba hat geschrieben:@ audax:
Haskell an sich ist ja ganz ok...besonders weil man zum Beispiel viele mathematische Formeln quasie direkt in Haskell übernehmen kann.
Aber an der Uni macht das kein Spaß.
Kann dir ja gerne mal den Link mit den Übungsaufgaben und Unterlagen geben, aber Musikstücke zu programmieren mit Haskell, machen vielen von uns nicht ganz so viel Spaß...
Und was noch dazukommt, man braucht Haskell nie wieder. Vor drei Wochen hatten wir die letzte Vorlesung für Haskell, wir werden die Sprache das ganze Studium nie wieder gebrauchen und später glaube ich auch nicht.
Na dnn bi ich ja beruhigt. Mein Anwedungszweck für Haskell wird die Mathematik sein, ich würd gern physikalische Simulationen in Haskell schreiben. Da die Sprache auch recht fix ist (wenn man ordentlich schreibt kommt sie auf die halbe Gerschwindigkeit von C!) und doch sehr Mathematisch orientiert ist scheint sie sich ganz gut dafür zu eignen.
Wir habne hier im Studium zum Glück Scheme am Anfang. Das erschlägt einen nicht gleich so mit außergewöhnlicher Syntax und bereitet wohl etwas besser auf Java vor ;)

Muss....in...die...Bilbiothek.....*sabber*
Studium ist super, Bibliotheken sind toll....aber warum muss ich dafür aus dem Haus gehen? :(
BlackJack

@BlackMamba: So sicher würde ich mir mit Haskell nicht sein. Der eine oder andere Dozent kann das doch noch wieder hervor kramen. Ist zum Beispiel beliebt um ADTs und Vor- und Nachbedingungen für prozedurale und objektorientierte Sprachen formal zu spezifizieren.

Ausserdem wird an funktionalen Sprachen viel geforscht.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Naja, und außerdem kann man mit Haskell toll Compiler bauen. Oder Bytecode-Interpreter. Oder Assembler-Interpreter :)

Da gabs auch letztens eine recht interessante Diskussion auf reddit zum Thema "Wofür ist Computer Science gut". Dummerweise ist die Suchfunktion von Reddit so ziemlich die schlechteste die ich jemals gesehen habe, daher kann ich das nicht mehr finden.

Edit: Link, dank mitsuhikos Idee Yahoo zu verwenden konnte ichs doch wiederfinden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackMamba
User
Beiträge: 77
Registriert: Samstag 24. März 2007, 23:22
Wohnort: Germany,NRW,

@ BlackJack:

Ich brauche Haskell wirklich nie wieder :-) Die anderen Profs und Dozenten mögen die Sprache überhaupt nicht. Die bevorzugen ehr Assembler oder Java...
Antworten