Что у вас есть работа, но это лучше Haskell стиль отделить чистые от IO. Ваш расчет getTriArea
не нужно запирать в монаде IO: поднимите его!
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)
Аппликативный на самом деле не нужен, он просто предоставляет несколько довольно инфиксных операторов. Монада прекрасно работает.
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)
В короткой программе, как это, он не действительно дела все, что много, но учтите, что даже тот импорт, то triArea
определения может оставаться чистым.
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)
Что вы делали до сих пор? –
То, что Haskell IO с поплавками и номерами уже разрушил мой разум, но у меня есть ответ. Итак, теперь я решил, что он решен –
Затем нажмите галочку рядом с одним из ответов. –