2013-08-16 22 views
14

Ich möchte das Wachstum im Laufe des Jahres in die Verbindung aber ich Dezimalpunkten sie sich nicht, also habe ich versuchtInteger Konvertieren in Haskell Double

take 52 $ iterate (floor . (*1.1)) 100 

Das Problem ist, dass die Art der (floor . (*1.1))Double -> Integer ist, während die Typ, der vom ersten Arg von Iterate erwartet wird, ist a -> a.

Ich versuchte ein paar Ansätze, aber am Ende bin ich in Knoten gebunden.

Was ist die bevorzugte Lösung, um numerische Typen über die Funktionsanwendung hinweg konsistent zu halten?

+4

Sie können Zwischenergebnisse nicht zu runden und hoffe, eine richtige Antwort am Ende zu bekommen. Warum nicht den 'floor' aus dem' iterate' verschieben und 'map floor' machen. nimm 52 $ ... '? – Fixnum

+0

@Fixnum Messepunkt, es war nur etwas, was ich versucht habe, in Ghci zu laufen, als ich auf das Problem stieß. –

Antwort

18

Der üblicher Weg, ein Int zu einem Double zu konvertieren ist fromIntegral, zu verwenden, die (Integral a, Num b) => a -> b den Typen hat. Dies bedeutet, dass ein Integral Typ (Int und Integer) in einen beliebigen numerischen Typ b konvertiert wird, von dem Double eine Instanz ist.

Ihr Fall klingt wie Sie eine Double zu einem Int konvertieren möchten, die ich floor empfehlen würde, aber Sie machen müssen, um sicherzustellen, dass Ihre Eingabe ein Double ist. Dazu können Sie die fromIntegral Funktion mit

take 52 $ iterate (floor . (* 1.1) . fromIntegral) 100 

jedoch verwenden, wird diese Ihnen ungenaue Ergebnisse geben, da man bei jedem Schritt werden abgeschnitten. Ich würde vorschlagen,

take 52 $ map floor $ iterate (* 1.1) $ fromIntegral 100 
+0

Ich werde auch hinzufügen, dass der letztere Ausdruck etwas schneller sein wird, da "fromIntegral" einmal ausgeführt wird, "(* 1.1)" wird immer noch wiederholt, und "floor" wird nur so oft wie nötig ausgeführt, obwohl ein Argument gemacht werden könnte "map floor" und "take 52" transponieren. – bheklilr

+3

Äquivalent geschrieben als: 'nehmen 52. Kartenboden. iterieren (* 1.1). von Integral $ 100 – Davorak