Ich arbeite durch die Definition Prompt
und seine Bind
Instanz beschrieben here und versuchte herauszufinden, wie dies in Purescript aussehen würde.Prompt Monad in Purescript
Ich verwende Purescript.Exists
für den existentiellen Typ. Mein defintion ist dann:
data PromptAskF p r a
= PromptAskF (p a) (a -> Prompt p r)
type PromptAsk p r = Exists (PromptAskF p r)
data Prompt p r
= Ask (PromptAsk p r)
| Answer r
instance bindPrompt :: Bind (Prompt p) where
bind (Answer x) k = k x
bind (Ask ask) k = ???
Ich stecke auf das Schreiben der Ask
Fall in der Bind
Instanz und insbesondere, ich bin sehr verwirrt über die Typen, wenn sie mit runExists
arbeiten.
Wie soll ich diese Instanz schreiben?
Danke,
Michael
Hallo Gary, danke für deine Antwort. Das macht für mich Sinn, aber anscheinend nicht für den Typ-Checker! Ich erhalte den folgenden Fehler: 'Fehler gefunden: im Modul Haupt in Zeile 26, Spalte 1 - Zeile 30, Spalte 26 Eine Typvariable hat seinen Bereich entkommen. im Ausdruck (flip runExists) fragen in Wertdeklaration bindPrompt' –
Ich habe gerade die Antwort aktualisiert, um die vollständige Implementierung zu enthalten, um sicherzustellen, dass es dieses Mal tatsächlich threechecks! Diese Fehlermeldung kann manchmal ziemlich schwierig sein, in diesem Fall war es wegen 'flip' 'runExists', aber selbst danach gab es etwas Seltsames (konnte das Lambda nicht in ein' wo' bringen, ohne dass es dazu kam). Wenn Sie es in 'runPA' verschieben, ist es ein wenig einfacher zu lesen, und wenn Sie die explizite Typ-Signatur für die Mapping-Funktion zur Verfügung stellen, vermeiden Sie andere potenzielle Skolem-Escape-Probleme. –
Super! Danke, dass Sie sich die Zeit genommen haben, um zu aktualisieren. Das ist mir jetzt dank der expliziten Rang-n-Typen tatsächlich klarer als die Haskell-Implementierung. –