2013-11-24 3 views
0

Если у меня есть две константы:Работа с IO монады в Haskell

type A = Int 
type B = Int 

, а затем применить функцию:

Number :: String −> (Int −> Bool) −> IO Int 
Number n = do 
    num <- fmap getNumber getLine 
    if num >0 || num <= A || num <= B then num else putStrln "Invalid Number!" 

это правильно?

+0

Это на самом деле довольно далеко от даже будучи синтаксически правильно. Невозможно понять, как есть: не могли бы вы написать минимальный пример и попытаться скомпилировать его, представив все ошибки компилятора? Я не думаю, что монада IO вызывает здесь проблемы. –

+2

1. 'type A = Int' не представляет собой константу. Это просто переименование типа 'Int'. Если вы хотите написать константу, просто определите функцию верхнего уровня, например '_A = 3.14'. 2. Где определяется 'getNumber'? Что оно делает? 3. 'Number' не является допустимым именем функции. 4. 'num' имеет тип' Num a => a' и 'putStrLn" .. '' имеет тип 'IO()'. Они не могут находиться в ветвях then/else того же оператора if. – user2407038

+1

Если бы это было правильно, вы могли бы скомпилировать его. Как ваш вопрос стоит, очевидный и правильный ответ просто «нет». Возможно, вам следует задать ряд более конкретных вопросов, которые говорят о любых путаницах, которые у вас есть. Из того, что я могу сказать, эти вопросы могут включать «что такое псевдоним типа?» и «Что такое синтаксическая форма определения функций?». –

ответ

1

Первая линия 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 
+0

Так в основном, как бы я переписал свою функцию? –

+0

@dcarou Я добавляю действительные функции – wit

+1

, если numA и numB меняются случайным образом, и я не знаю их значений, это их способ сделать это? –

Смежные вопросы