Tengo un problema con el alcance de Haskell en las definiciones where
. Cuando tengo la siguiente función f
, donde quiero pasar el x
a la función f1
definida localmente sin usarlo explícitamente como parámetro, me sale un error que dice que el tipo de x
es incompatible con el de f1
, aunque debería ser el mismo:Haskell scoping en definiciones de funciones anidadas utilizando
f :: Eq a => a -> [a] f x = f1 x where f1 :: Eq a => a -> [a] f1 y = [ x, y ]
el error es la siguiente:
Couldn't match expected type `a1' against inferred type `a' `a1' is a rigid type variable bound by the type signature for `f1' at test.hs:4:11 `a' is a rigid type variable bound by the type signature for `f' at test.hs:1:8 In the expression: x In the expression: [x, y] In the definition of `f1': f1 y = [x, y] Failed, modules loaded: none.
Cuando sin embargo pasar el x
como un parámetro adicional, como lo hice en el siguiente código con la función g
, que funciona bien:
g :: Eq a => a -> [a] g x = g1 x x where g1 :: Eq a => a -> a -> [a] g1 x y = [ x, y ]
¿Hay una manera de hacer el tipo a
en f
compatibles con el tipo a
(o a1
) en f1
?
Aunque es una muy buena práctica actualizar su código con lotes de firmas de tipo, excepto las partes extremadamente triviales, no veo la razón para actualizar las funciones de alcance local con ellas. Es obvio cuál es la firma de tipo, y para funciones triviales como esa, pierdes más en legibilidad de lo que ganas. – Rayne
Bueno, la función real era más compleja, solo la reduje a un simple ejemplo, por lo que mi problema real se aclararía. – poke