Sono un principiante Haskell. Sto cercando di creare un mini-linguaggio all'interno di Haskell e vorrei possibilmente avere una funzione di ordine superiore chiamata opp
(abbreviazione di "opposto") che converta un numero di funzioni familiari nei loro opposti evidenti. Ad esempio, opp succ
sarebbe la funzione pred
, opp head
sarebbe last
e così via. Non ho una definizione generale di cosa significhi convertire una funzione nel suo opposto: voglio solo scegliere alcuni esempi chiave e dichiarare quali sono i loro opposti. Quindi voglio una funzione altamente polimorfa che non viene quasi mai definita.È possibile definire una funzione "opposta" di ordine superiore caso per caso?
La difficoltà sembra essere che voglio riconoscere le funzioni con il loro nome piuttosto che con le loro essenze (per così dire). Una manifestazione di questa difficoltà è che se scrivo
opp succ = pred
quindi Haskell tratta succ
come una variabile e quindi mi dà una funzione costante che prende sempre il valore pred
. Quello che voglio veramente è di dire qualcosa di più simile a "Se vedi mai la stringa opp succ
allora pensa a un altro nome per pred
". Ma dopo aver cercato in giro per un po ', non riesco a scoprire come farlo (se è possibile a tutti).
In sintesi, vorrei definire una funzione
opp :: (a -> b) -> (a -> b)
da dire cose come
opp succ = pred
opp pred = succ
opp head = last
opp last = head
e aggiungere a questa lista ogni volta che ne ho voglia. Ovviamente non posso farlo in quel modo, ma c'è un modo non orribile per ottenere lo stesso effetto?
Bene. Ma questa nozione di "opposto" sembra piuttosto vagamente specificata in effetti. – leftaroundabout
Questo è un po 'il punto. Perché non esiste una buona definizione di "opposto", voglio definirlo caso per caso. – user15553
@ user15553 perché avere "opposto" a tutti allora? A questo punto puoi avere 'oppPred = succ' e non perdi il potere di espressione in relazione a ciò che hai specificato nella domanda. –