Los Haskell 2010 señala el Informe de idiomas en la sección 20.10.1.1 que:¿Hay una buena razón por la cual `deleteBy` no tiene su tipo más general?
deleteBy :: (a -> a -> Bool) -> a -> [a] -> [a]
De hecho, la aplicación en la GHC library permitiría
deleteBy :: (b -> a -> Bool) -> b -> [a] -> [a]
pero en realidad restringe el tipo a la anterior con el anotación.
Por lo tanto, no se puede decir, por ejemplo:
foo = deleteBy fsteq 42 [(43, "foo"), (44, "bar"), (42, "baz")] where
fsteq a (b,_) = a == b
porque Int
no es lo mismo que (Int, String)
.
¿Hay alguna buena razón para esto?
La razón por la que estoy preguntando es que, si no hay una buena razón para ello, incluiría deleteBy
con el tipo más general en el puerto Frege de Data.List que estoy haciendo actualmente. Pero tal vez estoy pasando por alto algo?
EDITAR: Como @hammar señaló, esto se aplica a otras xxx Por funciones también.
Ese es el tipo de comentarios perspicaces que estaba buscando. Me da algo en qué pensar. – Ingo
¡Esta es una respuesta muy perspicaz! – danr
¿Pero no debería resolverse 42 en 'Entero' por reglas de tipo de incumplimiento? – haskelline