Haskell (a - m a) - m (a - a) - m (a - a)

8

Ich habe die letzten Monate in Haskell gegraben, ich bin in eine Situation mit Monaden geraten, bei denen ich nicht ganz sicher bin, wie ich damit umgehen soll.

Ich habe einen Wert vom Typ a -> m a und einen zweiten vom Typ m (a -> a) und ich muss sie so zusammensetzen, dass das Ergebnis des ersten als Eingabe in den des zweiten endet und ein m (a -> a) if erzeugt möglich. Ich bin jetzt für den letzten Tag drangeblieben, und ich drehe meinen Kopf nicht darum herum. Ich vermute, dass ich nach einer Funktion wie (a -> m a) -> m (a -> a) -> m (a -> a) suche. Wenn es sinnvoller ist, kann ich ein konkreteres Beispiel geben.

    
Ben Doerr 05.04.2016, 20:12
quelle

1 Antwort

13

Das können Sie im Allgemeinen nicht tun. Das Problem ist Ihr Ergebnistyp: m (a -> a) . Dies ist eine einzelne monadische Aktion, die eine Funktion erzeugt; Ihre erste Eingabe hat jedoch die Form a -> m a , die (möglicherweise) eine andere monadische Aktion für jedes Argument erzeugt. So ist zum Beispiel für die [] monad [a -> a] eine Liste von Funktionen mit einer festen Länge, während a -> [a] für jedes Argument eine andere Länge haben kann. Es gibt also keine Möglichkeit, den Funktionstyp im Allgemeinen wieder in m zu "schieben". siehe Was ist der allgemeine Fall von QuickChecks Werbefunktion? für eine verwandte SO Frage.

Wenn a -> m a für das funktionieren würde, was Sie brauchen, können Sie Ihr m (a -> a) Argument in a -> m a mit

umwandeln %Vor%

und verwenden >=> (oder <=< , es ist nicht klar von Ihren Typen), um die Funktionen zusammen zu bilden.

    
Jonathan Cast 05.04.2016, 20:24
quelle

Tags und Links