Tutto quello che so è che uno funziona e l'altro no.Qual è la differenza tra `ix` e` at` nella libreria Lens di Haskell
Contesto: ho una struttura di dati che contiene un F
Data.Map.Map k S
ad un'altra struttura di dati S
. Il mio obiettivo era quello di costruire un Lens
che dato un F
e k
descrivesse un campo in S
.
La difficoltà è che il tasto k
potrebbe non essere presente nella mappa. Va bene, la funzione può avvolgere il suo ritorno in Forse. Tuttavia, non è stato possibile propagare un obiettivo attraverso un Forse usando at
. Dopo aver letto un sacco di risposte Stack Overflow, mi sono imbattuto in this one.
Risulta che la sostituzione at
con ix
risolto il problema di tipo se anche ho sostituito con (^.)
(^?)
.
Domanda: sembra at
e ix
fare la stessa cosa, almeno per quanto riguarda Map
. Entrambi prendono una chiave e danno una "lente" al valore di quella chiave. Tuttavia, ix
sembra funzionare correttamente con l'operatore di composizione delle funzioni (.)
. Qual è la differenza tra i due?
fuori tema Rant:
mi piace operatori infissi tanto quanto il prossimo ragazzo, ma il pacchetto Control.Lens sembra essere andato un po 'fuori bordo. Per un nuovo utente che ha alcuni nomi inglesi e una chiave da qualche parte abbasserebbe la curva di apprendimento. A causa dell'enorme numero di classi wrapper utilizzate nella libreria Lens, è particolarmente difficile scavare attraverso le firme del tipo se non si sa già cosa sta succedendo. Il mio codice sta iniziando a sembrare Perl per l'amor del cielo.
È possibile utilizzare 'lens' senza un singolo operatore infisso. Quasi ogni operatore è solo un alias conveniente per un nome non operatore - non è necessario utilizzarli (e spesso non lo faccio). – shachaf
quello che non puoi fare è cercare di leggere e capire il codice che altri hanno scritto, diciamo, nella cartella di esempio delle librerie. Il processo di copia di un codice e di battitura su di esso in GHCi è molto più difficile in Lens, quindi nella maggior parte delle altre librerie. –
@shachaf che non è vero: alcuni operatori altamente utili non esistono come parole, ovvero '% =' (non così male dato che è usato nei blocchi 'do') e'? ~ '(Piuttosto male, dato che è veramente utile in puro codice, che richiede il passaggio da '$' a '&' se non si vuole caricare su parens). – spopejoy