2011-12-19 9 views
6

¿Cómo puedo decir que Haskell interprete algo como un tipo especial? Por ejemplo, tengo una lista y desea dividir su longitud por 2. así escriboHaskell: "Cast"/force type?

(length mylist)/2 

y obtiene este error

Ningún caso de (Int fraccional) resultante de un uso de `/'

Como yo quiero una división de números enteros, me gustaría hacer length mylist, 2 y el resultado Int.

+0

JFI hay una función 'genericLength' en' Data.List'. En su caso, no devolverá la respuesta de números enteros, pero en general es útil, ya que le permite evitar algunas llamadas incómodas 'fromIntegral'. –

+0

Necesita más 'de Integral'. En serio, sin embargo, 'fromIntegral' es la forma mágica de" lanzar "un Int a cualquier cosa que ejemplifique la clase de tipo' Num'. –

Respuesta

11

Aquí hay dos problemas diferentes.

  • La división entera: Utilice la función div: div (length mylist) 2 o (length mylist) `div` 2

  • Casting. Uno puede decirle a Haskell que una expresión particular tiene un tipo particular al escribir expression :: type en lugar de solo expression. Sin embargo, esto no hace ningún "lanzamiento" o "conversión" de valores. Algunas funciones útiles para la conversión entre varios tipos numéricos y de cadena son fromIntegral, show, read, realToFrac, fromRational, toRational, toInteger, y otros. Puede buscarlos en Hoogle.

5

Probar div (length my list) 2. / hace división fraccional; div hace la división entera.

+0

Ah, gracias. ¿Y cómo hacerlo en general? ¿Siempre tiene que apegarse a la definición del tipo de funciones? – user905686

+0

Hay funciones que te permiten convertir de un tipo a otro (como un entero a un fraccionario), pero sí, la naturaleza de Haskell es tal que si los tipos no encajan en la definición de una función, * * obtendrá un error. – mipadi