La conversion d'Entier Double en Haskell
Je veux de croissance composé de plus d'un an mais je ne se soucient pas de décimales, donc j'ai essayé
take 52 $ iterate (floor . (*1.1)) 100
Le problème est que le type de (floor . (*1.1))
est Double -> Integer
, alors que le type attendu par le premier argument de itérer est a -> a
.
J'ai essayé plusieurs approches, mais il a fini d'attacher moi-même dans les noeuds.
Quelle est la meilleure solution pour garder les types numériques cohérentes à travers l'application de fonction?
Vous ne pouvez pas maintenir l'arrondissement des résultats intermédiaires et de l'espoir d'obtenir une réponse correcte à la fin. Pourquoi ne pas déplacer le
juste point, c'était juste quelque chose que j'ai essayé de courir dans ghci quand j'ai couru dans la question.
floor
de la iterate
et ne map floor . take 52 $ ...
?juste point, c'était juste quelque chose que j'ai essayé de courir dans ghci quand j'ai couru dans la question.
OriginalL'auteur Paul Carey | 2013-08-16
Vous devez vous connecter pour publier un commentaire.
La manière habituelle pour convertir un
Int
à unDouble
est d'utiliserfromIntegral
, qui a pour type(Integral a, Num b) => a -> b
. Cela signifie qu'il convertit unIntegral
type (Int
etInteger
) pour tout type numériqueb
, dontDouble
est un exemple.Votre cas semble que vous voulez convertir un
Double
à unInt
, que je recommandefloor
, mais vous aurez à vous assurer que votre entrée est unDouble
. Pour cela, vous pouvez utiliser lefromIntegral
fonction avecCependant, cela vous donnera des résultats inexacts, puisque vous êtes tronquer à chaque étape. Je suggère de faire
fromIntegral
est effectuée une fois,(* 1.1)
est encore répétée, etfloor
est effectué autant de fois que nécessaire, bien qu'un argument peut être faite pour transposermap floor
ettake 52
.De manière équivalente écrit:
take 52 . map floor . iterate (* 1.1) . fromIntegral $ 100
OriginalL'auteur bheklilr