2009-09-09 28 views
10

Todavía soy nuevo y trato de crear una lista para usar en una función y quiero mantenerla lo más pequeña posible que sea logBase x y. pero estoy teniendo problemas para convertir logBase en algo que pueda usar en esta lista.Haskell converting Float to Int

[1 .. (logBase x, y)]

¿Alguna sugerencia?

Respuesta

10

no pones lo que tipo de error que se obtiene, pero me imagino que es algo como esto:

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)] 

El problema es que:

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

devuelve un tipo en la clase flotante , mientras que otras variables en su programa (1, 'x', 'y') son de tipo integral.

Supongo que quieres una secuencia de números enteros?

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

Utilice truncate, celing o floor.

2

Probablemente desee algún tipo de función de redondeo, truncado, piso o techo. Ints y Floats son tipos diferentes (como has visto) y el compilador no te permitirá mezclarlos. Encontraré una referencia en un minuto.

8

Probablemente desee una de las funciones lista here. Hoogle y Hayoo! son excelentes herramientas para este tipo de cosas, ya que le permiten poner el tipo de función que desea y obtener una lista de funciones. Con el sistema de tipos enriquecidos de Haskell, puede ser una herramienta muy útil, mucho más que los lenguajes de tipeo dinámico o incluso los lenguajes tipados estáticos como C o Java.