Ich versuche, die Liste mit der kleinsten Summe der Elemente zu finden .:Warum bekomme ich einen Fehler Konnte nicht ableiten (Ord a)?
shortest :: (Num a) => [[a]] -> [a]
shortest [] = []
shortest (x:xs) = if sum x < sum (shortest xs) then x else shortest xs
Das ist mir die folgenden Fehler gibt:
Could not deduce (Ord a) arising from a use of `<' from the context (Eq a) bound by the type signature for shortest :: Eq a => [[a]] -> [a] at code.hs:(8,1)-(9,71) Possible fix: add (Ord a) to the context of the type signature for shortest :: Eq a => [[a]] -> [a] In the expression: sum x < sum (shortest xs) In the expression: if sum x < sum (shortest xs) then x else shortest xs In an equation for `shortest': shortest (x : xs) = if sum x < sum (shortest xs) then x else shortest xs
Warum funktioniert die Funktion typecheck?
"Kürzeste" ist nicht wirklich der richtige Name dafür, oder? - Erwägen Sie die Verwendung von 'minimumBy (vergleichen Sie \ 'on \' sum) 'mit Funktionen höherer Ordnung aus' Data.List' und 'Data.Function'. – leftaroundabout
Um dieses Problem zu verstehen, ist es wichtig zu wissen, dass nicht alle Nummern bestellt werden können. Betrachten wir zum Beispiel komplexe Zahlen wie '1 + 2i'; es gibt keine kanonische Art, sie zu bestellen. – dflemstr
@leftaroundabout schlug bereits eine Lösung mit Bibliotheksfunktionen vor; aber wenn Sie es immer noch von Grund auf als Übung schreiben wollen, müssen Sie neben der Behebung des Typensignaturproblems überlegen, was der Wert von 'kürzestes []' sein soll, oder mit anderen Worten, was die Grundlage der Rekursion sein soll (Hinweis: "Minimum" und "Maximum" sind normalerweise nicht für leere Listen definiert. –