Haskell “ne fait rien” IO ou si sans autre

Je veux faire quelque chose dans Haskell qui ressemble à ceci:

main1 = do s <- getLine if s == "foo" then putStr "You entered foo" 

De toute évidence, ce n’est pas légal puisqu’il n’y a pas d’ else . Une alternative à laquelle j’ai pensé:

 nop :: IO () nop = sequence_ [] main2 = do s <- getLine if s == "foo" then putStr "You entered foo" else nop 

C’est un peu verbeux, mais je le ferais si nécessaire. Je serais surpris s’il n’y avait pas une version intégrée de nop , cependant.

Alternativement:

 doIf :: Bool -> IO () -> IO () doIf bm = if b then m else nop main3 = do s <- getLine doIf (s == "foo") (putStr "You entered foo") 

C’est plus concis, mais la syntaxe n’est pas particulièrement agréable. Encore une fois, je ne serais pas surpris de trouver quelque chose qui existe déjà.

Quelle est la façon préférée de faire cela?

La façon la plus simple de faire une opération dans une monade est la suivante:

 return () 

Cependant, pour le langage que vous utilisez, un combinateur a déjà été créé pour vous:

 import Control.Monad main = do s <- getLine when (s == "foo") $ putStr "You entered foo" 

Ceci lorsque le combinateur se comporte exactement comme votre combinateur doIf 🙂

Vous pouvez utiliser Hoogle pour rechercher des fonctions, dans ce cas: when .

Dans Hoogle, vous pouvez entrer la signature de type et essayer de trouver les fonctions correspondantes dans les bibliothèques standard en unifiant les types et en réordonnant les arguments.

Dans votre cas, vous pouvez simplement entrer le type de votre fonction doIf : Bool -> IO () -> IO () . when est la troisième réponse ici, son inverse unless y en a aussi.