Finde das maximale Element und den Index einer Liste in Haskell

7

Ich mache meine ersten Schritte in die wunderbare Welt von Haskell. Als Übung möchte ich eine Methode implementieren, die das maximale Element einer Liste und deren Index findet. Nennen wir diese Funktion "maxi". Der Aufruf von maxi auf einer Liste sollte das folgende Ergebnis liefern:

%Vor%

4 ist das größte int in dieser Liste und es befindet sich in Index 2.

Ich habe versucht, diese Funktion wie folgt zu implementieren:

%Vor%

Wenn ich das nenne, bekomme ich etwas wirklich Seltsames: Ghci scheint zu hängen, nachdem der Wert des Max-Elements zurückgegeben wurde.

%Vor%

Ich werde eine Vermutung wagen, dass dies etwas mit Haskells fauler Evaluierungsnatur zu tun hat, aber ich finde es schwierig herauszufinden, was hier eigentlich vor sich geht und wie man es beheben kann. Ich wäre auch sehr dankbar für alle Tipps, die jemand zum Debuggen in Haskell haben könnte. Gibt es eine einfache Möglichkeit, während der Ausführung Werte auszudrucken, ohne das Verhalten zu beeinflussen?

Ich wollte nur darauf hinweisen, dass mir bewusst ist, dass es mehrere Möglichkeiten gibt, dieses Verhalten mithilfe integrierter Haskell-Funktionen zu erreichen. Ich implementiere das von Grund auf, um Haskell zu versuchen und zu lernen.

Danke

    
oneself 27.01.2013, 18:10
quelle

1 Antwort

20

Es liegt an einem kleinen Fehler in Ihrem Code. Sie haben:

%Vor%

... aber eigentlich sollte es sein:

%Vor%

Das behebt Ihren Code, der jetzt die richtige Lösung erzeugt:

%Vor%

Ihr Code wurde gehängt, weil Ihre Berechnung für ti zu einer Endlosschleife führt, da Sie sie versehentlich selbst definiert haben. Beachten Sie, dass ghc ein ausreichend intelligenter Compiler ist und feststellt, dass t nicht vom Wert von ti abhängt. Aus diesem Grund kann Ihre Version den Maximalwert auch dann erfolgreich berechnen, wenn sie den Index nicht berechnen kann.

Die Standardmethode zum Debuggen reiner Berechnungen ist das Debug.Trace -Modul.

Als Randnotiz gibt es eine viel einfachere Lösung:

%Vor%

Edit: Ups, ich habe nicht gesehen, dass Sie es absichtlich von Grund auf implementiert haben, aber ich werde das immer noch dort lassen.

    
Gabriel Gonzalez 27.01.2013, 18:20
quelle

Tags und Links