Sto lavorando sull'estensione camlp4 per la notazione haskell-like in Ocaml, e sto cercando di capire come GHC compila ricorsive do-bindings (abilitato con -XDoRec).
Mi chiedo se è possibile che il combinatore di fixpoint monadico esista in un linguaggio stretto (come Ocaml/F #/SML/...)?
Se sì, come può essere? Sarebbe molto utile?MonadFix in linguaggio stretto
risposta
La sintassi espressione # computazione F (correlate a Haskell do
) supporta ricorsione:
let rec ones = seq {
yield 1
yield! ones }
Ciò è supportato poiché il costruttore calcolo deve sostenere Delay
operazione oltre ad altre monadic (o MonadPlus) operazioni. Il codice è tradotto in modo seguente:
let rec ones =
seq.Combine
(seq.Yield(1),
seq.Delay(fun() -> seq.YieldFrom(ones)))
il tipo di Delay
è, in generale, (unit -> M<'T>) -> M<'T>
e il trucco è che avvolge un calcolo con effetti (o immediato riferimento ricorsivo) in un calcolo ritardato che viene valutata sulla richiesta.
Se volete saperne di più su come il meccanismo funziona in F #, allora le seguenti due carte sono rilevanti:
- Syntax Matters: Writing abstract computations in F#
- Initializing Mutually Referential Abstract Objects: The Value Recursion Challenge
Il primo descrive come la F # la sintassi delle espressioni di calcolo è desugared (e come è inserito Delay
- e in generale, come F # combina i calcoli ritardati e desiderosi con gli effetti) e il secondo descrive come F # gestisce let rec
dichiarazioni con valori - come il valore ones
sopra.
- 1. Istanza MonadFix per Put
- 2. Socat termina dopo legame stretto
- 3. Che cos'è un "anello stretto"?
- 4. matplotlib savefig dimensioni dell'immagine con bbox_inches = 'stretto'
- 5. Esiste un'istanza di Monad ma non di MonadFix?
- 6. ValueError: unichr() non arg in range (0x10000) (stretto Python build)
- 7. miscelazione largo e stretto letterali stringa in C
- 8. Iterator in linguaggio C
- 9. tokenizer in linguaggio coreano
- 10. Stretto rettangolo attorno al PDF di MATLAB figura
- 11. Matplotlib: impostare asse stretto solo per X o Y
- 12. Interfaccia in un linguaggio dinamico?
- 13. linguaggio di scripting in qlikvew
- 14. Oltre a un linguaggio dichiarativo, SQL è un linguaggio funzionale?
- 15. Uso efficiente di generatori Python in uno stretto doppio per array loop su numpy
- 16. Avvolgimento di etichette lunghe y in layout stretto a matrice usando setp
- 17. Comprensione linguaggio assembly
- 18. linguaggio assembly funzionale
- 19. ID linguaggio multiplo
- 20. Indice iterazione linguaggio
- 21. Linguaggio di programmazione misterioso
- 22. Estensione del linguaggio C#?
- 23. CMS in linguaggio di programmazione funzionale
- 24. Stampa di un numero in linguaggio assembly?
- 25. ambienti di sviluppo web in linguaggio misto
- 26. NSLocale di linguaggio caricato in applicazione
- 27. utilizzando Kivy Garden Graph in linguaggio KV
- 28. Split String in linguaggio naturale rompe
- 29. Elaborazione del linguaggio naturale in Ruby
- 30. Elaborazione del linguaggio naturale in PHP
Quindi, no - non è possibile in modo puramente rigoroso. Dal momento che tutti i linguaggi funzionali hanno un concetto di pigrizia (principalmente usando funzioni, chiusure e variabili) - è possibile in "linguaggi rigorosi" tramite costrutti pigri. –
Spesso la pigrizia è già lì, ma se la tua monade è dietro un tipo astratto, OCaml non ti permetterà di sfruttarla - "Questo tipo di espressione non è consentita come parte di destra di 'let rec''. Hai bisogno di argomenti spuri 'unit' in questi casi (o forse" pigri "se hai bisogno della memoizzazione ...) – lukstafi