Ich versuche gerade zu lernen Haskell und ich kann wirklich nicht verstehen, das Konzept der Verwendung nur einer Monade in Do-Block. Wenn ich foo :: Int -> Maybe Int
habe und in dieser Funktion zB die Funktion hIsEOF :: Handle -> IO Bool
verwenden möchte. Kann mir bitte jemand ein einfaches Beispiel erklären, wie würde ich verwenden und könnte irgendwie mit Bool
arbeiten?Mehrere Monaden in einem Do-Block
Ich habe versucht, hier und auf Google zu suchen, aber ich stoße immer auf etwas fortgeschrittenes Zeug, wo im Grunde niemand erklärt, wie, sie geben nur Ratschläge, wie man es richtig in OP-Code passt. Ich habe Monadetransformatoren in diesen Threads erwähnt, aber selbst nachdem ich nur wenige Ressourcen gelesen habe, kann ich nicht den richtigen Weg finden, wie man sie benutzt.
Danke. Also Schlussfolgerung ist, dass ich etwas zwischen ihnen konvertieren muss. Funktioniert sie wie Ihre 'thobenToIO'-Methode und ist eine gute Übung im Haskell-Code? Ich muss vor kurzem ein Projekt in Haskell machen und möchte keinen Spaghetti-Code produzieren. Außerdem habe ich kürzlich herausgefunden, dass etwas wie 'foo :: Int -> IO (Maybe Int)' scheint irgendwie für mich zu arbeiten, aber ist es eine schlechte Sache zu tun? Ist es hässlich? –
Es kann auch helfen, zu sehen, wie die Notation in die standardmäßigen monadischen Operatoren entpackt wird. https://en.wikibooks.org/wiki/Haskell/Syntactic_sugar#Do_notation – chepner
@ MarekMilkovič Ich würde nur für IO sagen, da IO sowieso fehleranfällig ist. Im Allgemeinen muss jede Monadenumwandlung anders durchgeführt werden und ist manchmal unmöglich. Außerdem werden Sie feststellen, dass 'foo' nicht so nützlich ist (insbesondere die meisten Anwendungen von' foo' werden einen besseren Weg haben, dies zu tun.) – PyRulez