0 Daumen
171 Aufrufe

Ich versuche, eine einzeilige Funktion zu schreiben, in die man eine Zahl und eine Liste eingibt, und die den höchsten Wert zurückgibt.

Zum Beispiel:

Input:

getMax 5 [1,4,7]

Output: 7

Hier ist mein aktueller Code:

getMax :: (Ord a) => a -> [a] -> a 
getMax f xs = foldr max f xs


Nun möchte ich meine Funktion so erweitern, dass ich statt einer Zahl eine Anonyme-Funktion eingeben kann, die verglichen werden soll.

Zum Beispiel:

Input:

getMax (\x -> mod x 5) [1,4,7]
Output: 4

Aber es funktioniert nicht. Ich erhalte die Fehlermeldung:

No instance for (Show (Integer -> Integer))

Ich habe versucht, die Typsignatur zu ändern, aber das hat nicht geholfen.

Avatar von

Vom Duplikat:

Titel: Argmax in Haskell (einzeilig)

Stichworte: haskell,programmieren

Ich möchte eine einzeilige Funktion "argmax" mit fold erstellen, bei der ich eine anonyme/lambda-Funktion und eine Liste eingebe. Dann wende ich die Funktion auf die Liste an und erhalte eine neue Liste basierend auf der Funktion. Nun ermittle ich den Maximalwert der zweiten Liste und gebe das Element aus der ersten Liste zurück, das bei der Anwendung der Funktion den Maximalwert erzeugt hat.

Das sollte so aussehen:

Ausgabe: argmax (\x -> mod x 5) [1,4,7]

Die zweite Liste wäre dann: [1,4,2]

Das maximale Element der zweiten Liste ist 4, also sollte es 4 aus der ersten Liste zurückgeben, denn mod 4 5 ist 4.

Die Ausgabe sollte also lauten: 4


Derzeit habe ich dies:

argmax :: (Ord a) => a -> [a] -> a
argmax f xs = foldr max f xs


aber es funktioniert nicht für anonyme Funktionen

Ich bekomme folgenden error:
No instance for (Show (Integer -> Integer))

Ich habe versucht die Typsignatur zu ändern, aber es hat nicht geholfen.

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Erklärung

Um eine Funktion zu erstellen, die eine anonyme Funktion (Lambda-Ausdruck) und eine Liste als Eingabe akzeptiert und den höchsten Wert zurückgibt, gibt es ein paar wichtige Punkte zu beachten:

1. Die Funktion max kann nur auf Werte angewendet werden, die miteinander verglichen werden können (Ord-Typklasse).
2. Du möchtest nicht nur einfache Werte, sondern Funktionsergebnisse vergleichen.

In Haskell können wir so etwas mit Hilfe der Funktion maximumBy aus dem Modul Data.List erreichen. Hier müssen wir eine Vergleichsfunktion zur Verfügung stellen.

Schritte

1. Importiere das Modul Data.List, um Zugriff auf maximumBy zu haben.
2. Definiere eine Vergleichsfunktion, die auf den Ergebnissen deiner anonymer Funktion basiert.

Code

Hier ist der vollständige Code, der deine Problemstellung löst:

haskell
import Data.List (maximumBy)
import Data.Ord (comparing)

getMax :: (a -> b) -> [a] -> a
getMax f xs = maximumBy (comparing f) xs

-- Beispielverwendung
main :: IO ()
main = do
    print $ getMax (\x -> mod x 5) [1,4,7] -- Output sollte 4 sein


Erklärung des Codes:

- import Data.List (maximumBy) importiert die Funktion maximumBy, die das Maximum einer Liste basierend auf einer Vergleichsfunktion findet.
- import Data.Ord (comparing) importiert die Funktion comparing, die eine Vergleichsfunktion für maximumBy erstellt.
- getMax :: (a -> b) -> [a] -> a ist die Typsignatur der Funktion. Diese Funktion nimmt eine Funktion von Typ a -> b und eine Liste von Typ [a] und gibt ein Element vom Typ a zurück.
- getMax f xs = maximumBy (comparing f) xs definiert getMax, wobei maximumBy (comparing f) xs das Maximum der Liste xs basierend auf den Ergebnissen der Funktion f findet.

Die Funktion getMax wird also jedes Element der Liste durch die Funktion f laufen lassen und dann das Element zurückgeben, das den maximalen Funktionswert hat.

Beispiel

Wenn du getMax (\x -> mod x 5) [1,4,7] aufrufst:
- mod 1 5 ergibt 1
- mod 4 5 ergibt 4
- mod 7 5 ergibt 2

Der höchste Funktionswert, basierend auf mod x 5, ist 4, daher gibt getMax (\x -> mod x 5) [1,4,7] den Wert 4 zurück.
Avatar von

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

0 Daumen
1 Antwort
0 Daumen
1 Antwort
0 Daumen
1 Antwort

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community