Ich möchte zwei Int
Werte in Haskell teilen und das Ergebnis als Float
erhalten. Ich habe versucht, es so zu tun:Was ist der richtige Weg, um zwei Int-Werte zu teilen, um einen Float zu erhalten?
foo :: Int -> Int -> Float
foo a b = fromRational $ a % b
aber GHC (Version 6.12.1) sagt mir, „konnte nicht erwartet Typ‚Integer‘gegen abgeleiteten Typ‚Int‘Match“ in Bezug auf die a
im Ausdruck.
Ich verstehe, warum: der fromRational
Aufruf (%)
ein Ratio Integer
herzustellen erfordert, so dass die Operanden müssen Integer
vom Typ sein, anstatt Int
. Aber die Werte, die ich teile, sind bei weitem nicht Int
Bereichsgrenze, so dass die Verwendung eines Bignum-Typs mit beliebiger Genauigkeit wie Overkill erscheint.
Was ist der richtige Weg? Sollte ich nur toInteger
auf meinen Operanden aufrufen, oder gibt es einen besseren Ansatz (vielleicht nicht (%)
und Verhältnisse), die ich nicht kenne?
Dank kurz ist, der Sinn macht. Ich habe mich gefragt, ob ich zuerst in 'Float' konvertieren könnte, aber irgendwie'Integral' übersehen habe, während ich in den Dokumenten nach allen Funktionen in den verschiedenen numerischen Klassen gesucht habe. (Ich glaube nicht, dass die andere Methode die ganze Zahl der Dezimalstellen verloren hätte, wie Sie anspielten): Ich habe aus den ganzen Zahlen einen 'Rational' gemacht, der die Genauigkeit nicht verliert. – Wyzard
@Wyzard: Sie waren kein Rational aus den ganzen Zahlen machen. Sie haben das Ergebnis des Operators * als * als Rational behandelt, obwohl es dies tatsächlich nicht war. Sehen Sie sich die Typ-Signatur für 'fromRational' an: Das Argument ist ein Rational, während' Ratio Int' und 'Ratio Integer' beide unterschiedliche Typen sind. Sie haben vielleicht beabsichtigt "toRational". – Chuck
@Chuck: 'Rational' ist ein Alias für' Ratio Integer', und '(%)' gibt ein 'Ratio' zurück, egal welcher Typ seine Operanden sind. Wenn man also auf 'Integer' anwendet, sollte ein' Rational' erzeugt werden (außer Ich bin ein Missverständnis. Mein Problem war, dass ich es "Int" gab und "Ratio Int" produzierte (was in der Tat * nicht * ein 'Rational' ist). – Wyzard