¿Cómo puedo definir el equivalente de esta función (tomada de learnyouahaskell ) dentro de 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 solo acepta una lista de unidades como parámetro.
¿Hay alguna forma de proporcionar declaraciones de tipo en GHCi? ¿O hay otra forma de definir funciones como estas que no requieren declaraciones de tipo?
No vi pistas obvias en la guía de GHCi y experimenté con expresiones como las siguientes (en vano):
> let numUniques' = ((length . nub) :: (Eq a) => [a] -> Int)
> :t numUniques'
numUniques' :: [()] -> Int
fuente
-XNoMonomorphismRestriction
está habilitado de forma predeterminada para GHCi desde 7.8.1: downloads.haskell.org/~ghc/latest/docs/html/users_guide/…Tenga en cuenta que también puede evitar la restricción de monomorfismo simplemente agregando "puntos" (es decir, variables explícitas) de nuevo a su expresión. Entonces esto también da el tipo correcto:
fuente
La Guía del usuario de GHC muestra dos formas adicionales de lograrlo. Esta subsección presenta la construcción
:{
...:}
, que se puede utilizar de la siguiente manera:> :{ | numUniques :: (Eq a) => [a] -> Int | numUniques = length . nub | :}
Alternativamente, puede habilitar el modo multilínea :
> :set +m > let | numUniques :: (Eq a) => [a] -> Int | numUniques = length . nub |
fuente