Was ist das äquivalent statement in der while-Schleife in Haskell?
Sehr neu Haskell, Frage ich mich, wie man 1) berechnen etwas, bis ein bestimmtes Kriterium erfüllt ist, und dann 2) return der berechnete Wert.
In den Sprachen, die ich kenne, verwenden Sie eine while-Schleife für die. Wie machst du es in Haskell?
- Haskell verwendet Rekursion anstelle von Schleifen.
- Ich glaube nicht, dass man sagen kann, dass für den Allgemeinen Fall, wie mapping, Faltung und Filterung sind auch an Stelle von loops. Abgesehen natürlich von noch mehr andere Funktionen und sogar Bibliotheken von Funktionen. Es hängt immer; ich würde sagen, auf der ersten Ebene des Werkzeug-lineup, es ist map, filter, fold und Rekursion.
- Haskell ist
map
,filter
und Falten sind alle implementiert, die als rekursive Funktionen,... Diese Funktionen fügen Sie einfach eine Schicht der Abstraktion auf der Oberseite der Rekursion, aber Sie finden immer die Rekursion an der Unterseite des ganzen. - Richtig, und ich leugne nicht, dass. Aber z.B. Lambda-Ausdrücke in C++ implementierte Klassen mit einem Funktionsaufruf-operator; doch würden Sie nicht die Beratung über die Verwendung von Klassen mit Funktionsaufruf-operator in denen ein lambda-Ausdruck (als Werkzeug) ist besser geeignet. Würden Sie sagen, dass Haskell-Karte et al sind weniger idiomatische und/oder ratsam, als "raw" Rekursion?
- Nein. Sollten Sie verwenden
map
,filter
,foldr
etc. wo immer es angebracht ist, aber ich sage, dass am unteren Rand des es, Rekursion Regeln Sie alle. - Natürlich und wahr; und doch würde ich lieber aufzählen, Sie in einer Sequenz mit Rekursion bei der Angabe von alternativen zu Schleifen; sowohl für pädagogische und idiomacy Gründen (zum öffnen die Büchse der Pandora: an der Unterseite alle, Python-interpreters oft mit Zeigern). Na ja, ich weiß, dass es ist mehr eine Präferenz Sache 🙂
- Eigentlich ist das nicht unbedingt wahr. Wenn Sie mit einem anderen (nicht-rekursive) Darstellung von Listen, schreiben Sie nicht-rekursive Implementierungen von
map
undfoldr
: haskellforall.com/2014/09/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie verwenden Rekursion:
Es gibt auch andere Programme, die Sie entdecken werden, in der Zukunft, wie
bis
, dass wird Ihnen helfen, mit diesem. Am Ende ist es wirklich hängt von der Semantik der loop-Bedingung. Zum Beispiel, wenn die Bedingung ist einfach, "bis wir erreichen das Ende einer Liste" können Sie einfachmap
oder einer derfold
-Familie Funktionen.while
loop in einigen Sprachen als Beispiel, ich könnte Ihnen zeigen, was wäre die Entsprechung in Haskell.fun = takeWhile (/= 0)
.myTakeWhile p (x:xs) = if p x then x : myTakeWhile p xs else []
. Das ist etwa der definition für den eingebautentakeWhile
.Haskell nicht über eine intrinsische äquivalent
while
loops basierend auf den veränderlichen Zustand.Stattdessen werden Sie in der Regel
map
Familie von Funktionen, die über einen Bereich von Werten zu produzieren, eine neue Reihe von Wertenfilter
Familie von Funktionen, die über einen Bereich von Werten zu produzieren, eine neue Teilmenge dieses Bereichs, die bestimmte Bedingungen erfülltfold
Familie von Funktionen zum aggregieren von etwas über diesen Bereich.
Natürlich, Haskell und Bibliotheken bieten Funktionen um Ihr Leben leichter machen, aber während
while
Schleifen kann als idiomatische/"first class" in imperativen Sprachen, was idiomatische/"first class" in Haskell (und anderen funktionalen Programmiersprachen) ist Rekursion, Zuordnung, Filterung und Faltung.Die Antwort ist die Rekursion. Zu geben, pedantisch Beispiel:
In Python:
In Haskell:
Beziehungsweise ohne pattern-matching
Oder effizienter
Wenn Sie wollen, etwas zu tun, wie das Lesen von text aus
STDIN
bis Sie eine Zeile, die liestq
, dann ist der einfachste Weg so etwas wieOder in Python
fib
ist eine schlechte Idee.