Вы делаете здесь некоторые ошибки, в основном с типами:
Линия:
num <- getLine
означает, что num
- это String
, но позже вы будете использовать его как число. Возможно, вы захотите использовать readLn :: Read a => IO a
, и, вероятно, лучше также указать тип:
num <- <b>readLn :: IO Int</b>
В ваших первых if
случаях:
if num >=1 && <=3
Неверно, так как он анализируется как (num >= 1) && (<= 3)
. Таким образом, правильный оператор не a Bool
, а (Num n, Ord n) => n -> Bool
, так что функция. Функция не True
или False
.
Вы должны заменить его на:
if num >=1 && <b>num <=3</b>
Позже вы пишете:
if num >=4 && getLine <=7
но и здесь типы не совпадают: getLine
имеет тип IO String
, так что это не число, даже не IO Int
. Вы, вероятно, хотите повторно использовать num
, поэтому:
if num >=4 && <b>num</b> <=7
Наконец, в else
записи вы пишете:
else <b>"Wrong health range indicated"</b>
Но тип health
равен IO ()
, а не String
, поэтому вы должны использовать putStrLn
:
else <b>putStrLn</b> "Wrong health range indicated"
Вы можете выделить putStrLn
в:
health :: IO ()
health = do
putStrLn "State your health using numbers 1 - 10: "
num <- <b>readLn :: IO Int</b>
--putStrLn "Your health is: "
<b>putStrLn</b> $
if <b>num <= 0 || num > 10</b> then "Wrong health range indicated"
else if num <= 3 then "Your health is poor"
else if num <= 7 then "Your health is OK"
else "your health is fanstastic"
Вышеприведенное все еще не идеально, так как чтение строки в Int
может пойти не так. Так что это может помочь использовать readMaybe
здесь, чтобы сделать программу более безопасной.