2014-07-10 24 views
5

In Haskell, una delle cose che ritengo sia piuttosto bella è il suo uso delle Monade come un'astrazione su azioni efficaci. Crea un modo davvero elegante per esprimere il codice imperativo, mentre consente anche che cose potenti accadano con garanzie sulla correttezza.IO Monade in lingue dinamicamente tipizzate

La monade IO non sembra essere specifica per le lingue fortemente tipizzate. In particolare, mi sembra che non sarebbe difficile o rivoluzionario implementare la monade IO in un linguaggio tipizzato dinamicamente. Sarebbe quindi solo necessario limitare la lingua in modo tale che tutte le azioni IO invece producano semplicemente azioni nella monade IO.

Detto questo, non ho visto nessun linguaggio (forse semplicemente non sto guardando abbastanza) che sono tipizzati dinamicamente, ma isolano gli effetti collaterali usando le monadi. C'è qualche ragione per cui questo è il caso? (o esistono?)

risposta

12

Hai unito due problemi qui. Non posso biasimarti per questo, perché gran parte della letteratura su Haskell combina anche le due idee. Ma l'IO digitato è da dove viene la magia nell'approccio di Haskell. Il fatto che il tipo di IO formi una monade non è poi così importante. Significa solo che può condividere le funzioni della libreria con altri tipi, invece di reimplementarli da soli.

L'astrazione di monade non funziona molto bene nelle lingue dinamicamente tipizzate. Certo, possono darti analoghi a fmap e (>>=), ma non c'è un buon modo per return di funzionare in un linguaggio tipizzato dinamicamente. È polimorfico in una variabile di tipo che appare solo nel suo tipo di ritorno. Non sono a conoscenza di alcun linguaggio con la digitazione dinamica che sia in grado di gestirlo in modo intelligente. Suppongo che ci siano probabilmente dei modi per hackerarlo usando qualcosa come una costruzione monade libera e tonnellate di introspezione, ma dubito che sembrerebbe un'astrazione utile.

L'altra parte però, digitata IO, potrebbe essere integrata in un linguaggio dinamico. Ovviamente diventerebbe IO con tag runtime, piuttosto che IO digitato. Ma tutto ciò che riguarda il linguaggio dovrebbe essere costruito per supportarlo. Il punto di ingresso per l'esecuzione del programma dovrebbe essere specificato per essere un valore di I/O, piuttosto che l'idioma comune di eseguire appena ogni riga nel file come preferisce la maggior parte delle lingue dinamiche. Quindi dovresti comporre i valori di IO usando sia i combinatori che la sintassi, come in Haskell. E infine, dovresti sopportare gli utenti che affermano che la lingua è troppo difficile da usare, perché non è identica a ciò a cui sono abituati.

Davvero, è l'ultimo che è un killer.

+0

OK, questo ha molto senso. Un sistema IO con tag runtime in un linguaggio dinamico è ciò a cui stavo pensando (anche se pensavo che avrebbe usato i combinatori monad). Non mi rendevo conto che c'erano altri tipi di combinatori per le azioni di I/O digitate, hai qualche esempio? – Mystor

+3

Bene, Clean utilizza un sistema basato su tipi di unicità per l'IO, ad esempio. Penso che probabilmente scoprirai che qualsiasi astrazione che funziona per l'I/O digitato equivale approssimativamente ai combinatori monadici. Il mio vero punto è che quei combinatori non sono la parte speciale del tipo IO. Sono solo degli operatori idraulici convenienti e si tratta di qualcosa che può essere definito polimorficamente nel sistema di tipi di Haskell. – Carl