In der Praxis
Nein, es kann nicht, zumindest nicht in einer sinnvollen Art und Weise durchgeführt werden.
diesem Code Haskell Betrachten
action :: Int -> IO String
action n = print n >> getLine
Diese n
erste nimmt, druckt er (IO hier ausgeführt), liest dann eine Linie vom Benutzer.
Angenommen, wir hatten eine hypothetische transform :: (a -> IO b) -> IO (a -> b)
. Dann als Gedankenexperiment betrachtet:
action' :: IO (Int -> String)
action' = transform action
Die oben hat alle IO im Voraus zu tun, bevor n
zu wissen, und dann eine reine Funktion zurück. Dies kann nicht dem obigen Code entsprechen.
den Punkt betonen, betrachten diesen Unsinn Code unten:
test :: IO()
test = do f <- action'
putStr "enter n"
n <- readLn
putStrLn (f n)
Magisch, action'
sollten im Voraus wissen, was der Benutzer neben geben wird! Eine Sitzung würde wie folgt aussehen:
Dies erfordert eine Zeitmaschine, so dass es nicht möglich ist.
In der Theorie
Nein, es kann nicht getan werden. Das Argument ähnelt the one I gave to a similar question.
Angenommen durch Widerspruch transform :: forall m a b. Monad m => (a -> m b) -> m (a -> b)
existiert. Spezialisieren Sie m
auf die Continuation Monad ((_ -> r) -> r)
(Ich überlasse den newtype Wrapper).
transform :: forall a b r. (a -> (b -> r) -> r) -> ((a -> b) -> r) -> r
Spezialisieren r=a
:
transform :: forall a b. (a -> (b -> a) -> a) -> ((a -> b) -> a) -> a
Bewerben:
transform const :: forall a b. ((a -> b) -> a) -> a
Durch die Curry-Howard Isomorphismus ist folgendes ein intuitionistic Tautologie
((A -> B) -> A) -> A
aber das ist Peirce " s Gesetz, das in intuitionistischer Logik nicht beweisbar ist. Widerspruch.
(Randnotiz: Sie wollte wirklich 'Monad m => (a -> mb) -> m (a -> b)' von Hoogle Beachten Sie die zusätzlichen Klammern, Bedeutung. Ein Argument statt "zwei". Natürlich, wie Chi bewiesen hat, ist dieser Typ nicht bewohnt, abgesehen von der Verwendung von Bottom, so dass Sie immer noch keine Ergebnisse erhalten.) – AndrewC