Ich versuche, eine Liste Verständnis zu verwenden, um den Median einer Liste zu finden, die immer drei ganze Zahlen mit der folgenden Funktion enthalten:Wie gibt ein Haskell-Listenverständnis ein Ergebnis aus, das eine ganze Zahl ist?
midNum set = [x | x <- set, x /= maximum set, x /= minimum set]!!0
Dies allein gut genug funktioniert, wie im folgenden Beispiel:
ghci> midNum [1,2,3]
2
aber es bläst, wenn ich versuche, es mit meinen anderen Funktionen in Verbindung zu verwenden, in den folgenden Fehlern führt:
*** Exception: Prelude.!!: index too large
Wenn ich entferne die ‚!! 0‘, der Compiler mir diese Nachricht gibt:
Triangle.hs:4:79: error:
* Occurs check: cannot construct the infinite type: t ~ [t]
* In the second argument of `(+)', namely
`squareOf (midNum triangle)'
In the second argument of `(==)', namely
`squareOf (minimum triangle) + squareOf (midNum triangle)'
In the expression:
squareOf (maximum triangle)
== squareOf (minimum triangle) + squareOf (midNum triangle)
* Relevant bindings include
triangle :: [t] (bound at Triangle.hs:4:9)
isRight :: [t] -> Bool (bound at Triangle.hs:4:1)
Failed, modules loaded: none.
So sieht es aus, als ob die Funktion mir eine ganze Zahl ist zu geben, aber der Compiler eine Liste erwartet. In einer anderen Sprache würde ich tippen, um das zu beheben, aber ich bin mir nicht sicher, was ich in Haskell machen soll.
Dies ist auch im Wesentlichen mein erster Sprung in Haskell, also vergib mir, wenn die Antwort offensichtlich ist.
Könnten Sie den Code hinzufügen, der zu einem Fehler führt? Ihr Beispiel sollte zu einer Liste mit einem Element ausgewertet werden. Ihr Beispiel wird nicht geprüft, wenn Sie 'Minimum' und' Maximum' anstelle von 'Min' und' Max' verwenden. – Lee
Wenn Sie wissen, dass die Liste immer 3 Elemente lang ist und nur den Medianwert haben soll, verwenden Sie 'sort list !! 1? – jkeuhlen
Ich bin weg von meinem Hauptcomputer atm, also kann ich die Fehler nicht hochladen. – MasterArcanist