2012-04-01 3 views
5

ich zur Zeit um mit Haskell Grundlagen spielte und eher zufällig auf dem Feld „Use Case“:eine Funktion einer → Verwenden Sie b als „monadischen“ Funktion a → mb

ghci> let divideTenBy x | x == 0 = Nothing | otherwise = Just (10/x) 
ghci> let composed = divideTenBy <=< return . (*10) <=< divideTenBy <=< return . (-)5 
ghci> Just 5 >>= composed 
Nothing 
ghci> Just 10 >>= composed 
Just (-0.5) 

Also im Grunde ist ich Mischen monadische und pure Funktionen hier und komponieren sie zu einer monadischen Funktion. Das funktioniert, aber die return . (*10) scheint mir eine häufig benötigte Sache, also bin ich versucht, eine Kurzschrift dafür zu definieren, so etwas wie monadify = (return.).

Bevor ich das tue, möchte ich jedoch fragen, ob es schon Helfer gibt, die sich mit dieser Situation beschäftigen. Natürlich könnte ich auch über das Ganze verwirrt sein und es gibt Gründe, warum das nicht gemacht werden sollte. Wenn ja, bitte sag es mir.

+0

Beachten Sie auch, dass 'mu >> = zurückgeben. f === liftM f mu === fmap f mu' (letzteres erfordert eine 'Functor'-Instanz, aber alle anständigen' Monaden' haben eine). Wie Daniel Wagners Antwort zeigt, "Rückkehr". f> => foo === foo. f'. In der anderen Argumentposition von '(> =>)' ist es nicht ganz so schön, 'foo> => return. f === fmap f. foo'. –

+0

@Daniel: Nett, danke für die Information! –

Antwort

7

Es gibt keinen Grund, es nicht zu tun. Es ist jedoch selten notwendig. Zum Beispiel kann Ihr Anwendungsfall neu geschrieben werden als

composed = divideTenBy . (*10) <=< divideTenBy . (-)5 
+0

Ich bin überrascht das ist mir nicht aufgefallen, es ist eigentlich ziemlich offensichtlich :) Ich denke, das beantwortet die Frage sehr gut, danke! –

Verwandte Themen