Die Kernidee ist, dass mapM
Karten eine „Aktion“ (dh Funktion vom Typ a -> m b
) über eine Liste und gibt Ihnen alle Ergebnisse als m [b]
. mapM_
macht das gleiche, aber sammelt nie die Ergebnisse und gibt eine m()
zurück.
Wenn Sie sich für die Ergebnisse Ihrer -Funktion interessieren (dh die b
s), verwenden Sie mapM
. Wenn Sie nur für den Effekt interessiert sind, was auch immer es ist, aber nicht den resultierenden Wert, verwenden Sie mapM_
, weil es effizienter sein kann und, noch wichtiger, macht Ihre Absichten klar.
Sie würden immer mapM_
mit Funktionen des Typs a -> m()
, wie print
oder putStrLn
verwenden. Diese Funktionen geben ()
zurück, um anzuzeigen, dass nur der Effekt von Bedeutung ist. Wenn Sie mapM
verwenden, erhalten Sie eine Liste von ()
(dh [(),(),()]
), die völlig nutzlos wäre, aber etwas Speicher verschwendet. Wenn Sie mapM_
verwenden, erhalten Sie nur eine ()
, aber es würde immer noch alles drucken.
Wenn Sie sich jedoch für die zurückgegebenen Werte interessieren, verwenden Sie mapM
. Stellen Sie sich als eine hypothetische Beispiel eine Funktion fetchUrl :: Url -> IO Response
-chances sind, kümmern Sie sich um die Antwort, die Sie für jede URL erhalten. Verwenden Sie dazu mapM
, um eine Liste mit Antworten zu erhalten, die Sie dann im Rest Ihres Codes verwenden können.
Also: mapM
wenn Sie sich für die Ergebnisse interessieren und mapM_
wenn Sie nicht.
Normal map
ist etwas anderes: Es nimmt eine normale Funktion (a -> b
) anstelle von einer mit einer Monade().Dies bedeutet, dass es kann keine Art von Wirkung neben der Rückgabe der geänderten Liste haben. Sie würden es verwenden, wenn Sie eine Liste mit einer normalen Funktion transformieren möchten. map_
existiert nicht, weil Sie, da Sie keine Effekte haben, immer über die Ergebnisse der Verwendung von map
kümmern.
dass der einzige Unterschied ist. 'mapM_' gibt' m() 'zurück und' mapM' gibt 'm [b]' zurück. Wenn Sie also die Ergebnisse wollen, benutzen Sie 'mapM'. Wenn Sie die Ergebnisse nicht wünschen (z. B. wenn Sie nur an den Nebenwirkungen interessiert sind), verwenden Sie 'mapM_'. –
Zwei von drei dieser Codes * funktionieren *. –
Entschuldigung es ist irgendwie mein Missverständnis, ich werde mich ändern. –