Ich versuche, in Haskell eine Aussage zu machen. Ich habe einige Beispiele hier auf SO gefunden, konnte sie aber nicht auf meinen Fall anwenden. Ich denke nur an eine stark verschachtelte Let-Anweisung, die ziemlich hässlich wirkt.
Anweisung, in der die Notation durch bind ersetzt werden soll:
%Vor%Jede Eingabe wird sehr geschätzt =)
Beachten Sie, dass dies einfacher ist, wenn Sie Applicatives:
verwenden %Vor% Dies ist ein ausgezeichneter Anwendungsfall für Anwendungsstil . Sie können Ihr gesamtes Snippet (nach dem Import von Control.Applicative
) durch
Denken Sie an den Anwendungsstil (mit <$>
und <*>
) als "lifting" -Funktionsanwendung, so dass es auch auf Funktoren funktioniert. Wenn du <$>
und <*>
mental ignorierst, sieht das ziemlich nach normaler Funktionsanwendung aus!
Der anwendende Stil ist nützlich, wenn Sie eine reine Funktion haben und unreine Argumente (oder irgendwelche Funktor-Argumente) geben wollen - im Grunde, wenn Sie das tun wollen, was Sie in Ihrer Frage angegeben haben!
Die Typensignatur von <$>
ist
bedeutet, dass es eine reine Funktion (in diesem Fall Node
) und einen Funktorwert (in diesem Fall numberNode x
) benötigt und eine neue Funktion erstellt, die "innerhalb" eines Funktors eingepackt ist. Sie können dieser Funktion weitere Argumente mit <*>
hinzufügen, die die Typ-Signatur
Wie Sie sehen, ist dies sehr ähnlich zu <$>
, aber es funktioniert nur, wenn die Funktion "innerhalb" eines Funktors eingeschlossen ist.
Ich möchte zu den Beiträgen über Applicative oben hinzufügen ..
Betrachtet den Typ von <$>
:
sieht genauso aus wie fmap:
%Vor%das ist auch sehr ähnlich wie Control.Monad.liftM:
%Vor%Ich denke dabei als "Ich muss den Datenkonstruktor in diesen Typ heben"
Wenn Sie feststellen, dass Sie Folgendes tun:
%Vor%Sie können dies stattdessen tun:
%Vor%Im ersten Beispiel wird bind verwendet, um den Wert aus dem Typ der Aktion herauszulösen, indem f aufgerufen wird und das Ergebnis dann erneut gepackt wird. Stattdessen können wir f anheben, so dass es die Art von Aktion als Argument benötigt.
Tags und Links haskell do-notation