2009-09-09 7 views
10

Je suis encore nouveau et essaye de créer une liste pour une utilisation dans une fonction et je veux la garder aussi petite que possible qui se trouve être logBase x y. mais j'ai du mal à insérer logBase dans quelque chose que je peux utiliser dans cette liste.Haskell convertissant Float en Int

[1 .. (Logbase x y)]

Toutes les suggestions?

Répondre

10

Vous ne vous postez pas quelle erreur de type, mais j'imagine que c'est quelque chose comme ceci:

Prelude> let x = 2 
Prelude> let y = 7 
Prelude> [1 .. (logBase x y)] 

<interactive>:1:7: 
    No instance for (Floating Integer) 
     arising from a use of `logBase' at <interactive>:1:7-17 
    Possible fix: add an instance declaration for (Floating Integer) 
    In the expression: (logBase x y) 
    In the expression: [1 .. (logBase x y)] 
    In the definition of `it': it = [1 .. (logBase x y)] 

Le problème est que:

Prelude> :t logBase 
logBase :: (Floating a) => a -> a -> a 

retourne un type dans la classe flottante , tandis que les autres variables de votre programme (1, 'x', 'y') sont de type entier.

Je présume que vous voulez une séquence de nombres entiers?

Prelude> :set -XNoMonomorphismRestriction 
Prelude> let x = 2 
Prelude> let y = 42 
Prelude> [1 .. truncate (logBase x y)] 
[1,2,3,4,5] 

Utiliser une troncature, un revêtement ou un sol.

2

Vous souhaitez probablement une fonction d'arrondi, de tronquage, de sol ou de plafond. Ints et Floats sont de types différents (comme vous l'avez vu) et le compilateur ne vous laissera pas les mélanger. Je trouverai une référence dans une minute.

8

Vous voulez probablement une des fonctions here. Hoogle et Hayoo! sont d'excellents outils pour ce genre de chose car ils vous permettent de mettre dans le type de la fonction que vous voulez et de récupérer une liste de fonctions. Avec le système de type riche de Haskell, cela peut être un outil très utile, beaucoup plus que des langages typés dynamiquement ou même des langages statiquement typés comme C ou Java.