extractPatternStrings ∷ IO [(Map String SqlValue)] → IO [String]
Un IO [String]
est une action IO qui produit un résultat [String]
. L'utilisation de la notation Do garantit que extractPatternStrings
produit un IO [String]
, et non un [String]
. Un IO [(Map String SqlValue)]
est une action d'E/S qui produit un résultat [Map String SqlValue]
. Mais vous ne pouvez pas faire correspondre le pattern à une action IO. La syntaxe que vous utilisez est destinée à correspondre directement à une liste, et non à une action d'E/S produisant une liste.
Vous devez utiliser cette signature de type à la place:
extractPatternStrings ∷ [Map String SqlValue] → IO [String]
Sauf que, comme @missingno souligne, cela n'a pas besoin d'être une action IO:
extractPatternStrings ∷ [Map String SqlValue] → [String]
extractPatternStrings [] = []
extractPatternStrings (m:ms) = toString m : extractPatternStrings ms
where
toString ∷ Map String SqlValue → String
toString m = (fromSql . fromJust . (Map.lookup "word"))∷ String
Ou, mieux (et la fixation d'une erreur dans toString
):
extractPatternStrings ∷ [Map String SqlValue] → [String]
extractPatternStrings = map toString
where
toString ∷ Map String SqlValue → String
toString = fromSql . fromJust . Map.lookup "word"
Plus succinctement:
extractPatternStrings ∷ [Map String SqlValue] → [String]
extractPatternStrings = map (fromSql . fromJust . Map.lookup "word")
Si vous devez vraiment avoir la signature originale, puis utilisez liftM
, que ce soit en changeant votre code appelant à selectAll ↠ liftM extractPatternStrings
(et je dois avouer que je ne reconnais pas l'opérateur que vous utilisez là-bas), ou en définissant extractPatternStrings
comme
extractPatternStrings ∷ IO [Map String SqlValue] → IO [String]
extractPatternStrings = liftM $ map (fromSql . fromJust . Map.lookup "word")
Mais je recommande le premier.
Pourquoi utilisez-vous IO ici? Cela ressemble à ce qu'il aurait pu être une pure fonction à la place. – hugomg
J'utilise IO car je lis depuis une base de données.Si je n'utilise pas d'E/S, le code de lecture de la base de données me donne une erreur en voulant 'renvoyer' un E/S. – providence