So implementieren Sie diese Funktion in Haskell

8

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%     
mentics 10.09.2011, 17:35
quelle

2 Antworten

10

Ich denke du willst toDyn , nicht fromDynamic . Also machen wir das langsam:

%Vor%

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:

%Vor%

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:

%Vor%

Es gibt einfachere Implementierungen (z. B. return () oder k (\a -> return ()) , aber diese scheint sinnvoll zu sein.

    
nominolo 10.09.2011, 17:54
quelle
4

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:

%Vor%

was zu nominolos Antwort passt.

    
Joey Adams 10.09.2011 18:04
quelle

Tags und Links