2016-06-23 10 views
1

Ich dachte, es war liftM, aber die Art Unterschrift scheint nicht richtig. Ich hatte gehofft, für eine Funktion wie:Kann nicht herausfinden, welche Monade-Funktion ich suche

someFunc :: Monad m => (a -> b) -> a -> m b 
someFunc f = return . f 

Ich weiß, dass ich dies mit dem obigen Code definieren kann, aber mein Bauch sagt dies existiert bereits und ich bin nur sehe es aus irgendeinem Grunde nicht.

zB:

main = do 
    n_tmp <- getLine 
    let n = read n_tmp :: Int 

vs

main = do 
    getLine >>= someFunc read :: IO Int 

Oder bin ich nur Dinge schrecklich falsch?

+0

In diesem speziellen Fall wahrscheinlich nur 'verwenden – agoebel

Antwort

4

halb scherzhaft, suchen Sie (return.), eine einfache partielle Anwendung von (.) auf die return Funktion. Es ist kaum mehr Typisierung, die für einen vernünftigen Namen erforderlich sein würde, die ihm zugewiesen werden könnten:

someFunc :: Monad m => (a -> b) -> a -> m b 
someFunc = (return.) 
-- or someFunc = (.)return 

Vergleichen

getLine >>= someFunc read :: IO Int 
getLine >>= return.read :: IO Int 
9

In Fällen wie diesen ich nur fmap verwenden ....

main = do 
    n <- fmap read getLine 
    .... 
+0

Dank readLn', ich denke, ich ist gerade auf die Idee gekommen, aus irgendeinem Grund '>> =' zu benutzen – agoebel

Verwandte Themen