Utilizzare QueueT o attenersi agli elenchi nativi f #

6

Ho bisogno di qualcosa che rappresenti una coda in F #.

La coda verrà riempita di elementi una volta e (mentre l'applicazione avanza) gli oggetti saranno presi da questa coda e spostati in altri elenchi.

Dovrei usare la classe Queue in .NET, o dovrei evitarlo, e usare invece gli elenchi nativi in F #? C'è una soluzione migliore?

Perché dovrei usare l'uno o l'altro in un linguaggio funzionale come F #?

    
posta TimothyP 02.01.2013 - 10:13
fonte

3 risposte

5

Se si sta creando una libreria di classi da condividere con altre applicazioni .NET, e questa è parte dell'interfaccia pubblica, è necessario attenersi ai normali tipi di libreria di classi .NET.

Se stai attaccando esclusivamente al dominio F # o questo fa parte dei dettagli di implementazione privata, preferirei utilizzare i tipi nativi di F #.

Nel tuo caso, tuttavia, l'elenco F # non corrisponde a una coda, almeno non a una coda FIFO (first in, first out). L'elenco F # corrisponde a uno stack (last in, first out).

Non sono a conoscenza di un tipo di dati F # nativo che fornisce tale funzionalità, e infatti, il tipo di dati della coda non si adatta bene al paradigma di programmazione puramente funzionale (non sono un esperto di programmazione funzionale quindi forse qualcuno dimostrerà questa affermazione errata).

Quindi la grande domanda su come risolvere il problema è davvero, il tuo problema è adatto al paradigma della programmazione funzionale? In questo caso, dovresti evitare di utilizzare tipi di dati imperativi come le code e provare a risolvere il problema utilizzando tipi di dati puramente funzionali.

Se il tuo problema d'altra parte non è adatto a un paradigma di programmazione funzionale, forse non dovresti usare affatto F #, ma usare un paradigma di programmazione più orientato agli oggetti. Non che F # non possa fare programmazione orientata agli oggetti, perché può farlo. Ma se questo è il paradigma di programmazione generale, è IMHO più facile da usare, ad es. C #.

    
risposta data 02.01.2013 - 11:15
fonte
4

@bytebuster ha fatto un commento sopra che mi ha fatto riflettere.

Il Queue<T> di .NET è mutabile e ha indubbiamente un'implementazione OO standard che ha garantito O (1) per accodamento e dequeue.

Okasaki è la versione funzionale immutabile standard di una coda e non ha la stessa garanzia, forse potresti applicare questa regola al tuo utilizzo in F #:

Se la struttura dei dati corretta è una coda per il tuo problema, e le prestazioni sono importanti (anche se non è per te, potrebbe essere importante per i tuoi consumatori, quindi vale la pena pensarci anche tu), attenersi a .NET mutabile coda.

Inoltre, sono d'accordo con l'altra risposta qui, se si tratta di una firma del metodo per essere utilizzata da altri linguaggi .NET, usa il comune .NET Queue<T>

Se le prestazioni sono irrilevanti e non devono essere utilizzate da altri linguaggi .NET, suppongo che sarebbe sicuro dire che dipende da te se vuoi o meno implementare una coda funzionale in F # da usare o semplicemente attenersi al Implementazione .NET.

    
risposta data 02.01.2013 - 16:39
fonte
1

Se utilizzi una coda nativa, puoi racchiuderla in un MailboxProcessor , in modo che la mutazione venga sincronizzata tra i thread, senza bisogno di blocchi.

    
risposta data 22.01.2016 - 00:29
fonte

Leggi altre domande sui tag