2010-06-22 17 views
58

¿Cómo puedo definir el equivalente de esta función (tomada de learnyouahaskell) dentro de GHCi?Cómo proporcionar declaraciones explícitas de tipo para funciones cuando se usa GHCi?

import Data.List 

numUniques :: (Eq a) => [a] -> Int 
numUniques = length . nub 

Sin la declaración de tipo, GHCi acepta la definición de la función, pero termina con un tipo inútil:

Prelude Data.List> import Data.List 
Prelude Data.List> let numUniques' = length . nub 
Prelude Data.List> :t numUniques' 
numUniques' :: [()] -> Int 

La función resultante sólo acepta una lista de unidades como un parámetro.

¿Hay alguna manera de proporcionar declaraciones de tipo en GHCi? ¿O hay otra manera de definir funciones como estas que no requieren declaraciones de tipo?

vi ninguna pista evidentes en la guía GHCi, y experimentó con expresiones como las siguientes (en vano):

> let numUniques' = ((length . nub) :: (Eq a) => [a] -> Int) 
> :t numUniques' 
numUniques' :: [()] -> Int 

Respuesta

79

¿Hay una manera de presentar declaraciones de tipo de GHCi?

let numUniques' :: (Eq a) => [a] -> Int; numUniques' = length . nub 

O hay otra manera de definir funciones como estos que no requiere declaraciones de tipo?

Si apaga la restricción monomorphism con -XNoMonomorphismRestriction, se inferirá el tipo correcto.

+0

Perfecto - gracias! – mattbh

+2

Todavía no estoy allí con el monomorfismo, pero en general esta respuesta me indicó usar punto y coma para agrupar las definiciones en GHCi: los tutoriales se escriben como en un archivo .hs, lo que da muchos problemas cuando se prueba en GHCi (las funciones no son vinculantes etc.). –

13

Tenga en cuenta que también puede evitar la restricción de monomorfismo simplemente agregando "puntos" (es decir, variables explícitas) a su expresión. Esto también da el tipo correcto:

let numUniques x = length. nub $ x

+1

Gracias - eso es bueno saberlo. – mattbh

+0

Esto se conoce como eta-expansion – Bladt

Cuestiones relacionadas