El problema es s yáctico, en esta línea:
foreach x:[] f = (f x):[]
La aplicación del constructor en los patrones generalmente debe estar entre paréntesis. Esto funcionaría:
foreach (x:[]) f = (f x):[]
Por cierto ... la aplicación de funciones es la más alta prioridad, por lo que por otra parte no es necesario paréntesis en el lado derecho:
foreach (x:[]) f = f x:[]
Lo anterior es válido para cualquier constructor infija, pero como nota final, para las listas, en particular, hay una sintaxis especial:
foreach [x] f = [f x]
hay otros problemas con su código tal como está, pero ese es el error inmediato. Una visión rápida de los otros problemas:
foreach :: [a] → f → [r]
variables de tipo están implícitamente universalmente cuantificadas, por lo que esto significa cualquier tipo f
. Necesita un tipo más específico, es decir, a -> r
.
foreach x:[] f = (f x):[]
Esto es innecesario - el caso recursivo funcionará correctamente aquí, aplicando f
-x
y se hace llamar en la cola, dando el caso lista vacía.
foreach []:x f = []:(f x)
no creo que esto significa lo que creo que significa - esta es la coincidencia de patrones de la cabeza de una lista con la lista vacía []
, lo que implica que la función está trabajando en una lista de listas.
foreach (x:xs) f = (f x) : (foreach (xs f))
Los paréntesis aquí son innecesarios o incorrectos. De nuevo, la aplicación de función tiene mayor prioridad que operadores como :
. Además, (xs f)
significa aplicar xs
a f
, como si fuera una función.Para aplicar foreach
a dos argumentos, bastará con foreach xs f
.
Para la comparación, aquí está el código fuente de la (idénticos excepto por orden de los argumentos) la función de la biblioteca estándar map
:
map :: (a -> b) -> [a] -> [b]
map _ [] = []
map f (x:xs) = f x : map f xs
Por cierto: Esto ya existe, se llama 'map' y se define en la mitad de las líneas. – delnan
@delnan: con argumentos de esta manera, esto se llama 'for' (y se define en términos de' map' probablemente). –
@Alexandre: Ah sí, orden de argumento pasado por alto ... definición sería 'flip map'. – delnan