Первая линия num <- fmap getNumber getLine
правильно (если getNumber = read
), но вторая линия не
if num >0 || num <= A || num <= B then num else putStrln "Invalid Number!"
Давайте посмотрим на вторую часть if
выражения:
num :: Int
, но putStrln "Invalid Number!" :: IO()
Но они должны имеют один и тот же тип!
Если переписать then return num
эти средства типа return num :: IO Int
, но до сих пор putStrln "Invalid Number!" :: IO()
Первая часть if
это не правильно вообще: A
и B
типы, а не конструкторы данных
мы могли бы написать (num > (x :: A)
), это означает, что так же, как num > (x :: Int)
, подобные этим:
num > 0 || num <= (3 :: A) || num <= (42 :: B)
Обновлено
Конечно, имя функции не может быть Number
с заглавной буквы. Все функции начинаются с буквы нижнего регистра.
P.S. n
в вашем примере это неиспользованная переменная
Допустимые функции выглядит следующим образом:
numA = 3
numB = 42
number = do
num <- fmap read getLine
if num > 0 || num <= numA || num <= numB
then return (Just num)
else putStrln "Invalid Number!" >> return Nothing
Это на самом деле довольно далеко от даже будучи синтаксически правильно. Невозможно понять, как есть: не могли бы вы написать минимальный пример и попытаться скомпилировать его, представив все ошибки компилятора? Я не думаю, что монада IO вызывает здесь проблемы. –
1. 'type A = Int' не представляет собой константу. Это просто переименование типа 'Int'. Если вы хотите написать константу, просто определите функцию верхнего уровня, например '_A = 3.14'. 2. Где определяется 'getNumber'? Что оно делает? 3. 'Number' не является допустимым именем функции. 4. 'num' имеет тип' Num a => a' и 'putStrLn" .. '' имеет тип 'IO()'. Они не могут находиться в ветвях then/else того же оператора if. – user2407038
Если бы это было правильно, вы могли бы скомпилировать его. Как ваш вопрос стоит, очевидный и правильный ответ просто «нет». Возможно, вам следует задать ряд более конкретных вопросов, которые говорят о любых путаницах, которые у вас есть. Из того, что я могу сказать, эти вопросы могут включать «что такое псевдоним типа?» и «Что такое синтаксическая форма определения функций?». –