Seite 1 von 2

Verfasst: Freitag 8. Februar 2008, 18:10
von noise
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

Verfasst: Freitag 8. Februar 2008, 23:08
von audax
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 ;)

Verfasst: Samstag 9. Februar 2008, 00:05
von BlackMamba
@ 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.

Verfasst: Samstag 9. Februar 2008, 00:07
von BlackMamba
@ noise:

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

Verfasst: Samstag 9. Februar 2008, 10:25
von 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']))

Verfasst: Samstag 9. Februar 2008, 10:40
von audax
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? :(

Verfasst: Samstag 9. Februar 2008, 12:12
von 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.

Verfasst: Sonntag 10. Februar 2008, 12:22
von Leonidas
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.

Verfasst: Mittwoch 13. Februar 2008, 22:51
von BlackMamba
@ BlackJack:

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