In pratica
No, non si può fare, almeno non in modo significativo.
Considerate questo codice Haskell
action :: Int -> IO String
action n = print n >> getLine
Questo richiede n
prima, lo stampa (IO eseguita qui), poi legge una riga da parte dell'utente.
Supponiamo di avere un ipotetico transform :: (a -> IO b) -> IO (a -> b)
. Poi, come un esperimento mentale, prendere in considerazione:
action' :: IO (Int -> String)
action' = transform action
È possibile che questo ha a che fare tutto il IO in anticipo, prima di conoscere n
, e poi restituire una pura funzione. Questo non può essere equivalente al codice sopra.
Per sottolineare il punto, si consideri questo codice assurdità di seguito:
test :: IO()
test = do f <- action'
putStr "enter n"
n <- readLn
putStrLn (f n)
Magicamente, action'
dovrebbe sapere in anticipo ciò che l'utente sta per digitare prossima! Una sessione potrebbe apparire come
42 (printed by action')
hello (typed by the user when getLine runs)
enter n
42 (typed by the user when readLn runs)
hello (printed by test)
Ciò richiede una macchina del tempo, quindi non può essere eseguita.
in teoria
No, non può essere fatto. L'argomento è simile a the one I gave to a similar question.
Presuppone per contraddittorio transform :: forall m a b. Monad m => (a -> m b) -> m (a -> b)
esistente. Specialize m
alla continuazione monad ((_ -> r) -> r)
(ometto il wrapper newtype).
transform :: forall a b r. (a -> (b -> r) -> r) -> ((a -> b) -> r) -> r
Specializzarsi r=a
:
transform :: forall a b. (a -> (b -> a) -> a) -> ((a -> b) -> a) -> a
Applicare:
transform const :: forall a b. ((a -> b) -> a) -> a
Con l'isomorfismo di Curry-Howard, il seguente è una tautologia intuizionistico
((A -> B) -> A) -> A
ma questo è Peirce ' s Legge, che non è dimostrabile nella logica intuizionista. Contraddizione.
(nota a margine: si voleva davvero 'Monade m => (a -> mb) -> m (a -> b)' da Hoogle Notare le staffe in più significato. un argomento piuttosto che "due". Naturalmente, come ha dimostrato il chi, quel tipo non è abitato oltre l'uso del fondo, quindi non otterrai ancora risultati.) – AndrewC