Qu'est-ce que vous avez des œuvres, mais il vaut mieux le style Haskell pour séparer pur de IO. Votre calcul getTriArea
n'a pas besoin d'être verrouillé dans la monade IO: retirez-le!
import Control.Applicative
prompt :: (Read a) => String -> IO a
prompt s = putStr s >> read <$> getLine
triArea :: (Fractional a) => a -> a -> a
triArea base height = (base * height)/2
main :: IO()
main = do
area <- triArea <$> prompt "The base? " <*> prompt "The height? "
putStrLn $ "The area of that triangle is " ++ show (area :: Float)
Applicatif n'est pas réellement nécessaire, il fournit juste quelques opérateurs assez infixes. Monad fonctionne très bien.
import Control.Monad
prompt :: (Read a) => String -> IO a
prompt s = putStr s >> fmap read getLine
triArea :: (Fractional a) => a -> a -> a
triArea base height = (base * height)/2
main :: IO()
main = do -- pick one of the following two lines
area <- liftM2 triArea (prompt "The base? ") (prompt "The height? ")
area <- return triArea `ap` prompt "The base? " `ap` prompt "The height? "
putStrLn $ "The area of that triangle is " ++ show (area :: Float)
Dans un programme court comme celui-ci, il ne vraiment question tout ce que beaucoup, mais notez que même les importations, la définition triArea
peuvent rester pure.
prompt :: (Read a) => String -> IO a
prompt s = putStr s >> getLine >>= return . read
triArea :: (Fractional a) => a -> a -> a
triArea base height = (base * height)/2
main :: IO()
main = do
base <- prompt "The base? "
height <- prompt "The height? "
let area = triArea base height
putStrLn $ "The area of that triangle is " ++ show (area :: Float)
Qu'avez-vous essayé jusqu'à présent? –
Que Haskell IO avec des flotteurs et des numéros ont déjà détruit mon esprit, mais j'ai une réponse. Donc, je suppose que c'est maintenant résolu –
Puis cliquez sur la coche à côté de l'une des réponses. –