Wunderbares an Haskell. Der Typ einer Funktion bestimmt fast ihre Implementierung. Das ist der Fall für diesen, aber ... mein Gehirn umkreist einfach nicht die geschachtelte Funktionssache hier:
%Vor%Die einzige Frage ist, wie die Fehlerbehandlung in dem Aufruf von Dynamic gehandhabt wird, die erforderlich sein wird, aber ... ich kann damit umgehen, sobald ich den Rest herausgefunden habe. Ich schätze, da muss irgendwo etwas wie das Folgende sein. Aber ich kann das Wrapper-Lambda-Zeug nicht herausfinden.
%Vor% Ich denke du willst toDyn
, nicht fromDynamic
. Also machen wir das langsam:
Unser Rückgabetyp sollte IO ()
sein und wir können dies entweder durch Aufruf von k
oder f
erreichen. Der Aufruf von f
hilft uns nicht sehr, weil wir irgendwie Dynamic
materialisieren würden, aber das können wir (sinnvollerweise) nicht von k
. Also wollen wir k
aufrufen. k
benötigt eine andere Funktion als Argument, also starten wir wie folgt:
Also ist das Argument der Funktion Typeable a => a -> IO ()
. Wir haben keine Funktion dieses Typs, aber wir haben eine Funktion vom Typ Dynamic -> IO ()
. Wegen der Einschränkung Typeable
können wir toDyn
verwenden, um unsere a
in Dynamic
umzuwandeln und zu erhalten:
Es gibt einfachere Implementierungen (z. B. return ()
oder k (\a -> return ())
, aber diese scheint sinnvoll zu sein.
Ich habe betrogen und das Djinn-Programm benutzt.
Ich habe zunächst den angegebenen Typ verallgemeinert:
%Vor% Das (a -> c)
repräsentiert die toDyn
Funktion Funktion und c
repräsentiert Dynamic
. b
steht für IO ()
.
Djinns Ergebnis war überraschend einfach:
%Vor% Durch Spezifizierung (indem wir (a -> c)
durch die Funktion toDyn
ersetzen) erhalten wir:
was zu nominolos Antwort passt.
Tags und Links haskell