Il problema è s yntactic, in questa linea:
foreach x:[] f = (f x):[]
applicazione Constructor nei modelli di solito bisogno di essere tra parentesi. Questo dovrebbe funzionare:
foreach (x:[]) f = (f x):[]
Per inciso ... applicazione funzione è più alta precedenza, così d'altra parte non è necessario parentesi sul lato destro:
foreach (x:[]) f = f x:[]
Quanto sopra vale per ogni costruttore di infisso, ma come una nota finale, per gli elenchi, in particolare, v'è una sintassi speciale:
foreach [x] f = [f x]
ci sono altri problemi con il codice così com'è, ma questo è l'errore immediato. Una rapida panoramica degli altri problemi:
foreach :: [a] → f → [r]
variabili di tipo sono implicitamente universalmente quantificate, quindi questo significa qualsiasi tipof
. Hai bisogno di un tipo più specifico, ovvero a -> r
.
foreach x:[] f = (f x):[]
Ciò non è necessario - il caso ricorsivo funziona correttamente qui, applicando f
-x
e si fa chiamare sulla coda, dando il caso lista vuota.
foreach []:x f = []:(f x)
non credo che questo significa quello che pensi che significa - questo è il pattern matching capo di una lista con l'elenco vuoto []
, il che implica che la funzione sta lavorando su una lista di liste.
foreach (x:xs) f = (f x) : (foreach (xs f))
Le parentesi qui sono non necessarie o errate. Ancora una volta, l'applicazione della funzione ha una precedenza più elevata rispetto agli operatori come :
. Inoltre, (xs f)
significa applicare xs
a f
, come se fosse una funzione.Per applicare foreach
a due argomenti, è sufficiente foreach xs f
.
Per confronto, ecco il codice sorgente per il (identici tranne che per ordine degli argomenti) funzione di libreria standard map
:
map :: (a -> b) -> [a] -> [b]
map _ [] = []
map f (x:xs) = f x : map f xs
A proposito: questo esiste già, è chiamato 'mappa' e definito a metà delle righe. – delnan
@delnan: con argomenti in questo modo, questo è chiamato 'for' (e definito in termini di' map' probabilmente). –
@Alexandre: Ah sì, l'ordine degli argomenti trascurati ... la definizione sarebbe 'flip map'. – delnan