¿Por qué haskell requiere varias reglas de reescritura dependiendo de la técnica y longitud de composición de la función? Hay alguna manera de evitar esto?Haskell Reglas de reescritura y composición de funciones
Por ejemplo, dado el siguiente código ...
{-# RULES
"f/f" forall a. f (f a) = 4*a
#-}
f a = 2 * a
esto funciona para
test1 = f (f 1)
sin embargo tenemos que añadir una regla para
test2 = f . f $ 1
y
test3 = f $ f 1
que nos deja con las siguientes reglas
{-# RULES
"f/f1" forall a. f (f a) = 4 * a
"f/f2" forall a. f . f $ a = 4 * a
"f/f3" forall a. f $ f $ a = 4 * a
#-}
Sin embargo, cuando la cadena estos juntos o utilizar otras formas de composición de las reglas no se activan.
test4 = f . f . f $ 1
test5 = f $ f $ f $ 1
test6 = f $ 1
¿Por qué es esto? ¿Debo escribir reglas de reescritura para cada implementación posible?
No lo sé, pero supongo que es porque las reglas de reescritura no se aplican a las funciones que ha importado. Y '$' y '.' son solo funciones importadas del Preludio. –