Im Moment sieht mein Code wie folgt aus:Haskell binden mit mehreren Monaden
postUser :: ServerPart Response
postUser = do
-- parseBody :: ServerPart (Maybe User)
parsedUser <- parseBody
case parsedUser of
Just user -> do
-- saveUser :: User -> ServerPart (Maybe (Key User))
savedUser <- saveUser user
case savedUser of
Just user -> successResponse
Nothing -> errorResponse "user already exists"
Nothing -> errorResponse "couldn't parse user"
Welche funktioniert, aber ich weiß, gibt es eine Möglichkeit, die verschachtelte Pattern-Matching zu vermeiden. Ich dachte, das war es, was binden würde für mich tun, also habe ich versucht
parseUser :: ServerPart (Maybe User)
addUser :: User -> ServerPart (Maybe())
case parseUser >>= saveUser of
Just _ -> success
Nothing -> error
und
savedUser <- (parseUser >>= saveUser)
case savedUser of
Just _ -> success
Nothing -> error
Aber ich erhalte den folgenden Fehler:
Couldn't match type ‘Maybe a0’ with ‘User’
Expected type: Maybe a0 -> ServerPartT IO (Maybe (Key User))
Actual type: User -> ServerPart (Maybe (Key User))
In the second argument of ‘(>>=)’, namely ‘saveUser’
In the expression: parseBody >>= saveUser
, die ich nehmen zu bedeuten >>=
ist Anwendung saveUser
auf die Maybe User
anstelle der User
, die ich brauche, und ich bin mir nicht sicher, wie die Typen zu finagle passen. Wie kann ich dies umschreiben, um die Verschachtelung von verschachtelten Mustern zu vermeiden?
das hat total funktioniert, jetzt wie du erwähntest, ich versuche, 'parseBody' zu konvertieren, um MaybeT zu verwenden, mit dem ich auch Probleme habe. Ich fühle mich, als ob ich nah dran bin, aber immer noch keine passenden Typen finden kann. https://gist.github.com/feigter09/be2afa1fb6cb810f9e1c24d79882caf8 – Austin
Warum hast du 'ServerPart' zu' ServerPartT IO' gewechselt? –
'ServerPart' ist ein Alias für' ServerPartT IO', und als ich es als 'parseBody :: FromJSON a => MaybeT ServerPart a' hatte, bekam ich den Fehler:' Type Synonym 'ServerPart' sollte 1 Argument haben, aber wurde keine gegeben https://hackage.haskell.org/package/happstack-server-7.4.6.1/docs/Happstack-Server-Internal-Monads.html#t:ServerPart – Austin