Utilizza per la funzione ID Haskell

Quali sono gli usi per la funzione ID in Haskell?

È utile come argomento per le funzioni di ordine superiore (funzioni che assumono funzioni come argomenti), in cui si desidera che un valore particolare rimanga invariato.

Esempio 1 : lasciare un valore solo se si trova in un giusto, altrimenti restituire un valore predefinito di 7.

Prelude Data.Maybe> :t maybe maybe :: b -> (a -> b) -> Maybe a -> b Prelude Data.Maybe> maybe 7 id (Just 2) 2 

Esempio 2 : creazione di una funzione tramite una piega:

 Prelude Data.Maybe> :t foldr (.) id [(+2), (*7)] :: (Num a) => a -> a Prelude Data.Maybe> let f = foldr (.) id [(+2), (*7)] Prelude Data.Maybe> f 7 51 

Abbiamo costruito una nuova funzione f piegando un elenco di funzioni insieme a (.) , Usando id come caso base.

Esempio 3 : il caso base per funzioni come monoidi (semplificato).

 instance Monoid (a -> a) where mempty = id f `mappend` g = (f . g) 

Analogamente al nostro esempio con piega, le funzioni possono essere considerate valori concatenabili, con l’ id serve per il caso vuoto e (.) Come append.

Esempio 4 : una funzione hash banale.

 Data.HashTable> h <- new (==) id :: IO (HashTable Data.Int.Int32 Int) Data.HashTable> insert h 7 2 Data.HashTable> Data.HashTable.lookup h 7 Just 2 

Gli hashtables richiedono una funzione di hashing. Ma cosa succede se la tua chiave è già hash? Quindi passare la funzione id, da compilare come metodo di hashing, con overhead delle prestazioni pari a zero.

Se manipoli numeri, in particolare con addizione e moltiplicazione, avrai notato l’utilità di 0 e 1. Analogamente, se si manipolano le liste, la lista vuota risulta piuttosto utile. Allo stesso modo, se si manipolano le funzioni (molto comuni nella programmazione funzionale), si noterà lo stesso tipo di utilità id .

Nei linguaggi funzionali, le funzioni sono valori di prima class che è ansible passare come parametro. Quindi uno degli usi più comuni di id viene fuori quando si passa una funzione come parametro a un’altra funzione per dirgli cosa fare. Una delle scelte su cosa fare è probabilmente “lascia stare” – in tal caso, si passa id come parametro.

Supponiamo che tu stia cercando un qualche tipo di soluzione per un puzzle in cui fai una mossa ad ogni turno. Si inizia con una posizione candidata. In ogni fase c’è una lista di possibili trasformazioni che potresti fare in pos (ad esempio, scorrere un pezzo nel puzzle). In un linguaggio funzionale è naturale rappresentare le trasformazioni come funzioni, quindi ora puoi creare un elenco di mosse usando un elenco di funzioni. Se “fare nulla” è una mossa legale in questo puzzle, allora lo si rappresenterebbe con id . Se non lo facessi, dovresti gestire “fare niente” come un caso speciale che funziona in modo diverso da “fare qualcosa”. Usando id puoi gestire tutti i casi in modo uniforms in un unico elenco.

Questo è probabilmente il motivo per cui esistono quasi tutti gli usi di id . Gestire “fare nulla” in modo uniforms con “fare qualcosa”.

Per un diverso tipo di risposta:

Lo farò spesso quando concatenando più funzioni tramite composizione:

 foo = id . bar . baz . etc 

al di sopra di

 foo = bar . baz . etc 

Mantiene le cose più facili da modificare. Si possono fare cose simili con altri elementi “zero”, come

 foo = return >>= bar >>= baz foos = [] ++ bars ++ bazs 

Posso anche aiutare a migliorare il tuo punteggio di golf. Invece di usare

($)

puoi salvare un singolo personaggio usando id.

per esempio

zipWith id [(+1), succ] [2,3,4]

Un risultato interessante, più che utile.

Dal momento che stiamo trovando belle applicazioni di id . Ecco, hai un palindromo 🙂

 import Control.Applicative pal :: [a] -> [a] pal = (++) <$> id <*> reverse 

Immagina di essere un computer, ovvero puoi eseguire una sequenza di passaggi. Quindi se voglio che tu rimanga nel tuo stato attuale, ma devo sempre darti un’istruzione (non posso solo distriggersre l’audio e lasciare passare il tempo), quale istruzione ti do? Id è la funzione creata per questo, per restituire l’argomento invariato (nel caso del computer precedente l’argomento sarebbe il suo stato) e per avere un nome per esso. Quella necessità appare solo quando si hanno funzioni di alto livello, quando si opera con le funzioni senza considerare ciò che è dentro di loro, che ti costringe a rappresentare simbolicamente anche l’implementazione del “non fare nulla”. Analogamente, 0 visto come una quantità di qualcosa, è un simbolo dell’assenza di quantità. In realtà in Algebra sia 0 che id sono considerati gli elementi neutri delle operazioni + e ∘ (composizione della funzione) rispettivamente, o più formalmente:

per tutti x del numero tipo:

  • 0 + x = x
  • x + 0 = x

per tutte le funzioni di tipo f:

  • id ∘ f = f
  • f ∘ id = f

Ogni volta che devi avere una funzione da qualche parte, ma vuoi fare qualcosa di più che limitarti a tenere la sua posizione (con ‘indefinito’ come esempio).

È anche utile, come (prossimamente) Dr. Stewart menzionato sopra, per quando è necessario passare una funzione come argomento a un’altra funzione:

 join = (>>= id) 

o come risultato di una funzione:

 let f = id in f 10 

(presumibilmente, modificherai la funzione precedente in seguito per fare qualcosa di più “interessante” …;)

Come altri hanno già detto, id è un posto meraviglioso per quando hai bisogno di una funzione da qualche parte.